JMJPFU 28-Feb-2020 This is the notebook for exploratory data analysis for the Curn project. Lord bless this attempt of yours

Let us look the first user record

assign('churnData' ,`telecom_churn_data.(1)`)
churnData[1:10,]

Let us look at the different columns and pick some of them for verification

names(churnData)
  [1] "mobile_number"            "circle_id"                "loc_og_t2o_mou"          
  [4] "std_og_t2o_mou"           "loc_ic_t2o_mou"           "last_date_of_month_6"    
  [7] "last_date_of_month_7"     "last_date_of_month_8"     "last_date_of_month_9"    
 [10] "arpu_6"                   "arpu_7"                   "arpu_8"                  
 [13] "arpu_9"                   "onnet_mou_6"              "onnet_mou_7"             
 [16] "onnet_mou_8"              "onnet_mou_9"              "offnet_mou_6"            
 [19] "offnet_mou_7"             "offnet_mou_8"             "offnet_mou_9"            
 [22] "roam_ic_mou_6"            "roam_ic_mou_7"            "roam_ic_mou_8"           
 [25] "roam_ic_mou_9"            "roam_og_mou_6"            "roam_og_mou_7"           
 [28] "roam_og_mou_8"            "roam_og_mou_9"            "loc_og_t2t_mou_6"        
 [31] "loc_og_t2t_mou_7"         "loc_og_t2t_mou_8"         "loc_og_t2t_mou_9"        
 [34] "loc_og_t2m_mou_6"         "loc_og_t2m_mou_7"         "loc_og_t2m_mou_8"        
 [37] "loc_og_t2m_mou_9"         "loc_og_t2f_mou_6"         "loc_og_t2f_mou_7"        
 [40] "loc_og_t2f_mou_8"         "loc_og_t2f_mou_9"         "loc_og_t2c_mou_6"        
 [43] "loc_og_t2c_mou_7"         "loc_og_t2c_mou_8"         "loc_og_t2c_mou_9"        
 [46] "loc_og_mou_6"             "loc_og_mou_7"             "loc_og_mou_8"            
 [49] "loc_og_mou_9"             "std_og_t2t_mou_6"         "std_og_t2t_mou_7"        
 [52] "std_og_t2t_mou_8"         "std_og_t2t_mou_9"         "std_og_t2m_mou_6"        
 [55] "std_og_t2m_mou_7"         "std_og_t2m_mou_8"         "std_og_t2m_mou_9"        
 [58] "std_og_t2f_mou_6"         "std_og_t2f_mou_7"         "std_og_t2f_mou_8"        
 [61] "std_og_t2f_mou_9"         "std_og_t2c_mou_6"         "std_og_t2c_mou_7"        
 [64] "std_og_t2c_mou_8"         "std_og_t2c_mou_9"         "std_og_mou_6"            
 [67] "std_og_mou_7"             "std_og_mou_8"             "std_og_mou_9"            
 [70] "isd_og_mou_6"             "isd_og_mou_7"             "isd_og_mou_8"            
 [73] "isd_og_mou_9"             "spl_og_mou_6"             "spl_og_mou_7"            
 [76] "spl_og_mou_8"             "spl_og_mou_9"             "og_others_6"             
 [79] "og_others_7"              "og_others_8"              "og_others_9"             
 [82] "total_og_mou_6"           "total_og_mou_7"           "total_og_mou_8"          
 [85] "total_og_mou_9"           "loc_ic_t2t_mou_6"         "loc_ic_t2t_mou_7"        
 [88] "loc_ic_t2t_mou_8"         "loc_ic_t2t_mou_9"         "loc_ic_t2m_mou_6"        
 [91] "loc_ic_t2m_mou_7"         "loc_ic_t2m_mou_8"         "loc_ic_t2m_mou_9"        
 [94] "loc_ic_t2f_mou_6"         "loc_ic_t2f_mou_7"         "loc_ic_t2f_mou_8"        
 [97] "loc_ic_t2f_mou_9"         "loc_ic_mou_6"             "loc_ic_mou_7"            
[100] "loc_ic_mou_8"             "loc_ic_mou_9"             "std_ic_t2t_mou_6"        
[103] "std_ic_t2t_mou_7"         "std_ic_t2t_mou_8"         "std_ic_t2t_mou_9"        
[106] "std_ic_t2m_mou_6"         "std_ic_t2m_mou_7"         "std_ic_t2m_mou_8"        
[109] "std_ic_t2m_mou_9"         "std_ic_t2f_mou_6"         "std_ic_t2f_mou_7"        
[112] "std_ic_t2f_mou_8"         "std_ic_t2f_mou_9"         "std_ic_t2o_mou_6"        
[115] "std_ic_t2o_mou_7"         "std_ic_t2o_mou_8"         "std_ic_t2o_mou_9"        
[118] "std_ic_mou_6"             "std_ic_mou_7"             "std_ic_mou_8"            
[121] "std_ic_mou_9"             "total_ic_mou_6"           "total_ic_mou_7"          
[124] "total_ic_mou_8"           "total_ic_mou_9"           "spl_ic_mou_6"            
[127] "spl_ic_mou_7"             "spl_ic_mou_8"             "spl_ic_mou_9"            
[130] "isd_ic_mou_6"             "isd_ic_mou_7"             "isd_ic_mou_8"            
[133] "isd_ic_mou_9"             "ic_others_6"              "ic_others_7"             
[136] "ic_others_8"              "ic_others_9"              "total_rech_num_6"        
[139] "total_rech_num_7"         "total_rech_num_8"         "total_rech_num_9"        
[142] "total_rech_amt_6"         "total_rech_amt_7"         "total_rech_amt_8"        
[145] "total_rech_amt_9"         "max_rech_amt_6"           "max_rech_amt_7"          
[148] "max_rech_amt_8"           "max_rech_amt_9"           "date_of_last_rech_6"     
[151] "date_of_last_rech_7"      "date_of_last_rech_8"      "date_of_last_rech_9"     
[154] "last_day_rch_amt_6"       "last_day_rch_amt_7"       "last_day_rch_amt_8"      
[157] "last_day_rch_amt_9"       "date_of_last_rech_data_6" "date_of_last_rech_data_7"
[160] "date_of_last_rech_data_8" "date_of_last_rech_data_9" "total_rech_data_6"       
[163] "total_rech_data_7"        "total_rech_data_8"        "total_rech_data_9"       
[166] "max_rech_data_6"          "max_rech_data_7"          "max_rech_data_8"         
[169] "max_rech_data_9"          "count_rech_2g_6"          "count_rech_2g_7"         
[172] "count_rech_2g_8"          "count_rech_2g_9"          "count_rech_3g_6"         
[175] "count_rech_3g_7"          "count_rech_3g_8"          "count_rech_3g_9"         
[178] "av_rech_amt_data_6"       "av_rech_amt_data_7"       "av_rech_amt_data_8"      
[181] "av_rech_amt_data_9"       "vol_2g_mb_6"              "vol_2g_mb_7"             
[184] "vol_2g_mb_8"              "vol_2g_mb_9"              "vol_3g_mb_6"             
[187] "vol_3g_mb_7"              "vol_3g_mb_8"              "vol_3g_mb_9"             
[190] "arpu_3g_6"                "arpu_3g_7"                "arpu_3g_8"               
[193] "arpu_3g_9"                "arpu_2g_6"                "arpu_2g_7"               
[196] "arpu_2g_8"                "arpu_2g_9"                "night_pck_user_6"        
[199] "night_pck_user_7"         "night_pck_user_8"         "night_pck_user_9"        
[202] "monthly_2g_6"             "monthly_2g_7"             "monthly_2g_8"            
[205] "monthly_2g_9"             "sachet_2g_6"              "sachet_2g_7"             
[208] "sachet_2g_8"              "sachet_2g_9"              "monthly_3g_6"            
[211] "monthly_3g_7"             "monthly_3g_8"             "monthly_3g_9"            
[214] "sachet_3g_6"              "sachet_3g_7"              "sachet_3g_8"             
[217] "sachet_3g_9"              "fb_user_6"                "fb_user_7"               
[220] "fb_user_8"                "fb_user_9"                "aon"                     
[223] "aug_vbc_3g"               "jul_vbc_3g"               "jun_vbc_3g"              
[226] "sep_vbc_3g"              

Find the columns with null values

Derive summary statistics of various columns

summary(churnData)
 mobile_number         circle_id   loc_og_t2o_mou std_og_t2o_mou loc_ic_t2o_mou last_date_of_month_6
 Min.   :7.000e+09   Min.   :109   Min.   :0      Min.   :0      Min.   :0      6/30/2014:99999     
 1st Qu.:7.001e+09   1st Qu.:109   1st Qu.:0      1st Qu.:0      1st Qu.:0                          
 Median :7.001e+09   Median :109   Median :0      Median :0      Median :0                          
 Mean   :7.001e+09   Mean   :109   Mean   :0      Mean   :0      Mean   :0                          
 last_date_of_month_7 last_date_of_month_8 last_date_of_month_9     arpu_6             arpu_7        
          :  601               : 1100               : 1659      Min.   :-2258.71   Min.   :-2014.05  
 7/31/2014:99398      8/31/2014:98899      9/30/2014:98340      1st Qu.:   93.41   1st Qu.:   86.98  
                                                                Median :  197.70   Median :  191.64  
                                                                Mean   :  282.99   Mean   :  278.54  
     arpu_8             arpu_9          onnet_mou_6       onnet_mou_7       onnet_mou_8      
 Min.   : -945.81   Min.   :-1899.51   Min.   :   0.00   Min.   :   0.00   Min.   :    0.00  
 1st Qu.:   84.13   1st Qu.:   62.69   1st Qu.:   7.38   1st Qu.:   6.66   1st Qu.:    6.46  
 Median :  192.08   Median :  176.85   Median :  34.31   Median :  32.33   Median :   32.36  
 Mean   :  279.15   Mean   :  261.65   Mean   : 132.40   Mean   : 133.67   Mean   :  133.02  
  onnet_mou_9        offnet_mou_6      offnet_mou_7      offnet_mou_8       offnet_mou_9     
 Min.   :    0.00   Min.   :   0.00   Min.   :   0.00   Min.   :    0.00   Min.   :    0.00  
 1st Qu.:    5.33   1st Qu.:  34.73   1st Qu.:  32.19   1st Qu.:   31.63   1st Qu.:   27.13  
 Median :   29.84   Median :  96.31   Median :  91.73   Median :   92.14   Median :   87.29  
 Mean   :  130.30   Mean   : 197.94   Mean   : 197.04   Mean   :  196.57   Mean   :  190.34  
 roam_ic_mou_6      roam_ic_mou_7      roam_ic_mou_8       roam_ic_mou_9      roam_og_mou_6    
 Min.   :    0.00   Min.   :    0.00   Min.   :    0.000   Min.   :   0.000   Min.   :   0.00  
 1st Qu.:    0.00   1st Qu.:    0.00   1st Qu.:    0.000   1st Qu.:   0.000   1st Qu.:   0.00  
 Median :    0.00   Median :    0.00   Median :    0.000   Median :   0.000   Median :   0.00  
 Mean   :    9.95   Mean   :    7.15   Mean   :    7.293   Mean   :   6.344   Mean   :  13.91  
 roam_og_mou_7      roam_og_mou_8      roam_og_mou_9      loc_og_t2t_mou_6  loc_og_t2t_mou_7 
 Min.   :   0.000   Min.   :   0.000   Min.   :   0.000   Min.   :   0.00   Min.   :   0.00  
 1st Qu.:   0.000   1st Qu.:   0.000   1st Qu.:   0.000   1st Qu.:   1.66   1st Qu.:   1.63  
 Median :   0.000   Median :   0.000   Median :   0.000   Median :  11.91   Median :  11.61  
 Mean   :   9.819   Mean   :   9.972   Mean   :   8.556   Mean   :  47.10   Mean   :  46.47  
 loc_og_t2t_mou_8   loc_og_t2t_mou_9   loc_og_t2m_mou_6  loc_og_t2m_mou_7  loc_og_t2m_mou_8 
 Min.   :    0.00   Min.   :    0.00   Min.   :   0.00   Min.   :   0.00   Min.   :   0.00  
 1st Qu.:    1.60   1st Qu.:    1.36   1st Qu.:   9.88   1st Qu.:  10.03   1st Qu.:   9.81  
 Median :   11.73   Median :   11.26   Median :  41.03   Median :  40.43   Median :  40.36  
 Mean   :   45.89   Mean   :   44.58   Mean   :  93.34   Mean   :  91.40   Mean   :  91.75  
 loc_og_t2m_mou_9  loc_og_t2f_mou_6   loc_og_t2f_mou_7   loc_og_t2f_mou_8  loc_og_t2f_mou_9 
 Min.   :   0.00   Min.   :   0.000   Min.   :   0.000   Min.   :  0.000   Min.   :  0.000  
 1st Qu.:   8.81   1st Qu.:   0.000   1st Qu.:   0.000   1st Qu.:  0.000   1st Qu.:  0.000  
 Median :  39.12   Median :   0.000   Median :   0.000   Median :  0.000   Median :  0.000  
 Mean   :  90.46   Mean   :   3.751   Mean   :   3.793   Mean   :  3.678   Mean   :  3.655  
 loc_og_t2c_mou_6  loc_og_t2c_mou_7  loc_og_t2c_mou_8  loc_og_t2c_mou_9   loc_og_mou_6     
 Min.   :  0.000   Min.   :  0.000   Min.   :  0.000   Min.   :  0.000   Min.   :    0.00  
 1st Qu.:  0.000   1st Qu.:  0.000   1st Qu.:  0.000   1st Qu.:  0.000   1st Qu.:   17.11  
 Median :  0.000   Median :  0.000   Median :  0.000   Median :  0.000   Median :   65.11  
 Mean   :  1.123   Mean   :  1.369   Mean   :  1.434   Mean   :  1.233   Mean   :  144.20  
  loc_og_mou_7      loc_og_mou_8       loc_og_mou_9      std_og_t2t_mou_6  std_og_t2t_mou_7 
 Min.   :   0.00   Min.   :    0.00   Min.   :    0.00   Min.   :   0.00   Min.   :   0.00  
 1st Qu.:  17.48   1st Qu.:   17.11   1st Qu.:   15.56   1st Qu.:   0.00   1st Qu.:   0.00  
 Median :  63.69   Median :   63.73   Median :   61.84   Median :   0.00   Median :   0.00  
 Mean   : 141.67   Mean   :  141.33   Mean   :  138.71   Mean   :  79.83   Mean   :  83.30  
 std_og_t2t_mou_8  std_og_t2t_mou_9  std_og_t2m_mou_6  std_og_t2m_mou_7   std_og_t2m_mou_8  
 Min.   :   0.00   Min.   :   0.00   Min.   :   0.00   Min.   :   0.000   Min.   :    0.00  
 1st Qu.:   0.00   1st Qu.:   0.00   1st Qu.:   0.00   1st Qu.:   0.000   1st Qu.:    0.00  
 Median :   0.00   Median :   0.00   Median :   3.95   Median :   3.635   Median :    3.31  
 Mean   :  83.28   Mean   :  82.34   Mean   :  87.30   Mean   :  90.804   Mean   :   89.84  
 std_og_t2m_mou_9   std_og_t2f_mou_6  std_og_t2f_mou_7  std_og_t2f_mou_8  std_og_t2f_mou_9 
 Min.   :    0.00   Min.   :  0.000   Min.   :  0.000   Min.   :  0.000   Min.   :  0.000  
 1st Qu.:    0.00   1st Qu.:  0.000   1st Qu.:  0.000   1st Qu.:  0.000   1st Qu.:  0.000  
 Median :    2.50   Median :  0.000   Median :  0.000   Median :  0.000   Median :  0.000  
 Mean   :   86.28   Mean   :  1.129   Mean   :  1.115   Mean   :  1.068   Mean   :  1.042  
 std_og_t2c_mou_6 std_og_t2c_mou_7 std_og_t2c_mou_8 std_og_t2c_mou_9  std_og_mou_6      std_og_mou_7     
 Min.   :0        Min.   :0        Min.   :0        Min.   :0        Min.   :   0.00   Min.   :    0.00  
 1st Qu.:0        1st Qu.:0        1st Qu.:0        1st Qu.:0        1st Qu.:   0.00   1st Qu.:    0.00  
 Median :0        Median :0        Median :0        Median :0        Median :  11.64   Median :   11.09  
 Mean   :0        Mean   :0        Mean   :0        Mean   :0        Mean   : 168.26   Mean   :  175.22  
  std_og_mou_8       std_og_mou_9       isd_og_mou_6       isd_og_mou_7       isd_og_mou_8     
 Min.   :    0.00   Min.   :    0.00   Min.   :   0.000   Min.   :   0.000   Min.   :   0.000  
 1st Qu.:    0.00   1st Qu.:    0.00   1st Qu.:   0.000   1st Qu.:   0.000   1st Qu.:   0.000  
 Median :   10.41   Median :    8.41   Median :   0.000   Median :   0.000   Median :   0.000  
 Mean   :  174.19   Mean   :  169.66   Mean   :   0.798   Mean   :   0.777   Mean   :   0.791  
  isd_og_mou_9       spl_og_mou_6       spl_og_mou_7       spl_og_mou_8       spl_og_mou_9     
 Min.   :   0.000   Min.   :   0.000   Min.   :   0.000   Min.   :   0.000   Min.   :   0.000  
 1st Qu.:   0.000   1st Qu.:   0.000   1st Qu.:   0.000   1st Qu.:   0.000   1st Qu.:   0.000  
 Median :   0.000   Median :   0.000   Median :   0.000   Median :   0.000   Median :   0.000  
 Mean   :   0.724   Mean   :   3.917   Mean   :   4.978   Mean   :   5.054   Mean   :   4.413  
  og_others_6       og_others_7      og_others_8       og_others_9      total_og_mou_6    
 Min.   :  0.000   Min.   :  0.00   Min.   :  0.000   Min.   :  0.000   Min.   :    0.00  
 1st Qu.:  0.000   1st Qu.:  0.00   1st Qu.:  0.000   1st Qu.:  0.000   1st Qu.:   44.74  
 Median :  0.000   Median :  0.00   Median :  0.000   Median :  0.000   Median :  145.14  
 Mean   :  0.454   Mean   :  0.03   Mean   :  0.033   Mean   :  0.047   Mean   :  305.13  
 total_og_mou_7     total_og_mou_8     total_og_mou_9     loc_ic_t2t_mou_6  loc_ic_t2t_mou_7 
 Min.   :    0.00   Min.   :    0.00   Min.   :    0.00   Min.   :   0.00   Min.   :   0.00  
 1st Qu.:   43.01   1st Qu.:   38.58   1st Qu.:   25.51   1st Qu.:   2.99   1st Qu.:   3.23  
 Median :  141.53   Median :  138.61   Median :  125.46   Median :  15.69   Median :  15.74  
 Mean   :  310.23   Mean   :  304.12   Mean   :  289.28   Mean   :  47.92   Mean   :  47.99  
 loc_ic_t2t_mou_8   loc_ic_t2t_mou_9   loc_ic_t2m_mou_6  loc_ic_t2m_mou_7  loc_ic_t2m_mou_8 
 Min.   :    0.00   Min.   :    0.00   Min.   :   0.00   Min.   :   0.00   Min.   :   0.00  
 1st Qu.:    3.28   1st Qu.:    3.29   1st Qu.:  17.29   1st Qu.:  18.59   1st Qu.:  18.93  
 Median :   16.03   Median :   15.66   Median :  56.49   Median :  57.08   Median :  58.24  
 Mean   :   47.21   Mean   :   46.28   Mean   : 107.48   Mean   : 107.12   Mean   : 108.46  
 loc_ic_t2m_mou_9  loc_ic_t2f_mou_6  loc_ic_t2f_mou_7   loc_ic_t2f_mou_8  loc_ic_t2f_mou_9 
 Min.   :   0.00   Min.   :   0.00   Min.   :   0.000   Min.   :   0.00   Min.   :   0.00  
 1st Qu.:  18.56   1st Qu.:   0.00   1st Qu.:   0.000   1st Qu.:   0.00   1st Qu.:   0.00  
 Median :  56.61   Median :   0.88   Median :   0.930   Median :   0.93   Median :   0.96  
 Mean   : 106.16   Mean   :  12.08   Mean   :  12.600   Mean   :  11.75   Mean   :  12.17  
  loc_ic_mou_6      loc_ic_mou_7      loc_ic_mou_8       loc_ic_mou_9      std_ic_t2t_mou_6  
 Min.   :   0.00   Min.   :   0.00   Min.   :    0.00   Min.   :    0.00   Min.   :   0.000  
 1st Qu.:  30.39   1st Qu.:  32.46   1st Qu.:   32.74   1st Qu.:   32.29   1st Qu.:   0.000  
 Median :  92.16   Median :  92.55   Median :   93.83   Median :   91.64   Median :   0.000  
 Mean   : 167.49   Mean   : 167.72   Mean   :  167.43   Mean   :  164.62   Mean   :   9.576  
 std_ic_t2t_mou_7  std_ic_t2t_mou_8   std_ic_t2t_mou_9   std_ic_t2m_mou_6  std_ic_t2m_mou_7 
 Min.   :   0.00   Min.   :   0.000   Min.   :   0.000   Min.   :   0.00   Min.   :   0.00  
 1st Qu.:   0.00   1st Qu.:   0.000   1st Qu.:   0.000   1st Qu.:   0.00   1st Qu.:   0.00  
 Median :   0.00   Median :   0.000   Median :   0.000   Median :   2.03   Median :   2.04  
 Mean   :  10.01   Mean   :   9.884   Mean   :   9.432   Mean   :  20.72   Mean   :  21.66  
 std_ic_t2m_mou_8  std_ic_t2m_mou_9  std_ic_t2f_mou_6   std_ic_t2f_mou_7   std_ic_t2f_mou_8  
 Min.   :   0.00   Min.   :   0.00   Min.   :   0.000   Min.   :   0.000   Min.   :   0.000  
 1st Qu.:   0.00   1st Qu.:   0.00   1st Qu.:   0.000   1st Qu.:   0.000   1st Qu.:   0.000  
 Median :   2.03   Median :   1.74   Median :   0.000   Median :   0.000   Median :   0.000  
 Mean   :  21.18   Mean   :  19.62   Mean   :   2.156   Mean   :   2.217   Mean   :   2.085  
 std_ic_t2f_mou_9   std_ic_t2o_mou_6 std_ic_t2o_mou_7 std_ic_t2o_mou_8 std_ic_t2o_mou_9  std_ic_mou_6    
 Min.   :   0.000   Min.   :0        Min.   :0        Min.   :0        Min.   :0        Min.   :   0.00  
 1st Qu.:   0.000   1st Qu.:0        1st Qu.:0        1st Qu.:0        1st Qu.:0        1st Qu.:   0.00  
 Median :   0.000   Median :0        Median :0        Median :0        Median :0        Median :   5.89  
 Mean   :   2.173   Mean   :0        Mean   :0        Mean   :0        Mean   :0        Mean   :  32.46  
  std_ic_mou_7      std_ic_mou_8      std_ic_mou_9     total_ic_mou_6    total_ic_mou_7   
 Min.   :   0.00   Min.   :   0.00   Min.   :   0.00   Min.   :   0.00   Min.   :   0.00  
 1st Qu.:   0.00   1st Qu.:   0.01   1st Qu.:   0.00   1st Qu.:  38.53   1st Qu.:  41.19  
 Median :   5.96   Median :   5.88   Median :   5.38   Median : 114.74   Median : 116.34  
 Mean   :  33.89   Mean   :  33.16   Mean   :  31.23   Mean   : 200.13   Mean   : 202.85  
 total_ic_mou_8     total_ic_mou_9      spl_ic_mou_6     spl_ic_mou_7     spl_ic_mou_8    spl_ic_mou_9   
 Min.   :    0.00   Min.   :    0.00   Min.   : 0.000   Min.   : 0.000   Min.   : 0.00   Min.   : 0.000  
 1st Qu.:   38.29   1st Qu.:   32.37   1st Qu.: 0.000   1st Qu.: 0.000   1st Qu.: 0.00   1st Qu.: 0.000  
 Median :  114.66   Median :  105.89   Median : 0.000   Median : 0.000   Median : 0.00   Median : 0.000  
 Mean   :  198.75   Mean   :  189.21   Mean   : 0.062   Mean   : 0.034   Mean   : 0.04   Mean   : 0.163  
  isd_ic_mou_6       isd_ic_mou_7       isd_ic_mou_8       isd_ic_mou_9       ic_others_6      
 Min.   :   0.000   Min.   :   0.000   Min.   :   0.000   Min.   :   0.000   Min.   :   0.000  
 1st Qu.:   0.000   1st Qu.:   0.000   1st Qu.:   0.000   1st Qu.:   0.000   1st Qu.:   0.000  
 Median :   0.000   Median :   0.000   Median :   0.000   Median :   0.000   Median :   0.000  
 Mean   :   7.461   Mean   :   8.335   Mean   :   8.442   Mean   :   8.063   Mean   :   0.855  
  ic_others_7        ic_others_8        ic_others_9       total_rech_num_6  total_rech_num_7
 Min.   :   0.000   Min.   :   0.000   Min.   :   0.000   Min.   :  0.000   Min.   :  0.0   
 1st Qu.:   0.000   1st Qu.:   0.000   1st Qu.:   0.000   1st Qu.:  3.000   1st Qu.:  3.0   
 Median :   0.000   Median :   0.000   Median :   0.000   Median :  6.000   Median :  6.0   
 Mean   :   1.013   Mean   :   0.971   Mean   :   1.017   Mean   :  7.559   Mean   :  7.7   
 total_rech_num_8  total_rech_num_9  total_rech_amt_6  total_rech_amt_7 total_rech_amt_8 
 Min.   :  0.000   Min.   :  0.000   Min.   :    0.0   Min.   :    0    Min.   :    0.0  
 1st Qu.:  3.000   1st Qu.:  3.000   1st Qu.:  109.0   1st Qu.:  100    1st Qu.:   90.0  
 Median :  5.000   Median :  5.000   Median :  230.0   Median :  220    Median :  225.0  
 Mean   :  7.213   Mean   :  6.893   Mean   :  327.5   Mean   :  323    Mean   :  324.2  
 total_rech_amt_9  max_rech_amt_6   max_rech_amt_7   max_rech_amt_8   max_rech_amt_9   date_of_last_rech_6
 Min.   :    0.0   Min.   :   0.0   Min.   :   0.0   Min.   :   0.0   Min.   :   0.0   6/30/2014:16960    
 1st Qu.:   52.0   1st Qu.:  30.0   1st Qu.:  30.0   1st Qu.:  30.0   1st Qu.:  28.0   6/29/2014:12918    
 Median :  200.0   Median : 110.0   Median : 110.0   Median :  98.0   Median :  61.0   6/27/2014:11169    
 Mean   :  303.4   Mean   : 104.6   Mean   : 104.8   Mean   : 107.7   Mean   : 101.9   6/28/2014: 9491    
 date_of_last_rech_7 date_of_last_rech_8 date_of_last_rech_9 last_day_rch_amt_6 last_day_rch_amt_7
 7/31/2014:17288     8/31/2014:14706     9/29/2014:22623     Min.   :   0.00    Min.   :   0.00   
 7/30/2014:13863     8/30/2014:11707     9/30/2014:21713     1st Qu.:   0.00    1st Qu.:   0.00   
 7/25/2014: 9401     8/29/2014:10057     9/28/2014:10601     Median :  30.00    Median :  30.00   
 7/29/2014: 9052     8/28/2014: 9816     9/27/2014: 6473     Mean   :  63.16    Mean   :  59.39   
 last_day_rch_amt_8 last_day_rch_amt_9 date_of_last_rech_data_6 date_of_last_rech_data_7
 Min.   :   0.00    Min.   :   0.0              :74846                   :74428         
 1st Qu.:   0.00    1st Qu.:   0.0     6/30/2014: 1888          7/31/2014: 1813         
 Median :  30.00    Median :   0.0     6/29/2014: 1651          7/29/2014: 1719         
 Mean   :  62.64    Mean   :  43.9     6/28/2014: 1643          7/30/2014: 1665         
 date_of_last_rech_data_8 date_of_last_rech_data_9 total_rech_data_6 total_rech_data_7 total_rech_data_8
          :73660                   :74077          Min.   : 1.00     Min.   : 1.00     Min.   : 1.00    
 8/31/2014: 1998          9/29/2014: 2329          1st Qu.: 1.00     1st Qu.: 1.00     1st Qu.: 1.00    
 8/30/2014: 1867          9/27/2014: 1810          Median : 1.00     Median : 1.00     Median : 1.00    
 8/29/2014: 1605          9/30/2014: 1425          Mean   : 2.46     Mean   : 2.67     Mean   : 2.65    
 total_rech_data_9 max_rech_data_6  max_rech_data_7  max_rech_data_8  max_rech_data_9  count_rech_2g_6
 Min.   : 1.00     Min.   :   1.0   Min.   :   1.0   Min.   :   1.0   Min.   :   1.0   Min.   : 0.00  
 1st Qu.: 1.00     1st Qu.:  25.0   1st Qu.:  25.0   1st Qu.:  25.0   1st Qu.:  25.0   1st Qu.: 1.00  
 Median : 2.00     Median : 145.0   Median : 145.0   Median : 145.0   Median : 145.0   Median : 1.00  
 Mean   : 2.44     Mean   : 126.4   Mean   : 126.7   Mean   : 125.7   Mean   : 124.9   Mean   : 1.86  
 count_rech_2g_7 count_rech_2g_8 count_rech_2g_9 count_rech_3g_6 count_rech_3g_7 count_rech_3g_8
 Min.   : 0.00   Min.   : 0.00   Min.   : 0.00   Min.   : 0.0    Min.   : 0.00   Min.   : 0.00  
 1st Qu.: 1.00   1st Qu.: 1.00   1st Qu.: 1.00   1st Qu.: 0.0    1st Qu.: 0.00   1st Qu.: 0.00  
 Median : 1.00   Median : 1.00   Median : 1.00   Median : 0.0    Median : 0.00   Median : 0.00  
 Mean   : 2.04   Mean   : 2.02   Mean   : 1.78   Mean   : 0.6    Mean   : 0.62   Mean   : 0.64  
 count_rech_3g_9 av_rech_amt_data_6 av_rech_amt_data_7 av_rech_amt_data_8 av_rech_amt_data_9
 Min.   : 0.00   Min.   :   1.0     Min.   :   0.5     Min.   :   0.5     Min.   :   1.0    
 1st Qu.: 0.00   1st Qu.:  82.0     1st Qu.:  92.0     1st Qu.:  87.0     1st Qu.:  69.0    
 Median : 0.00   Median : 154.0     Median : 154.0     Median : 154.0     Median : 164.0    
 Mean   : 0.66   Mean   : 192.6     Mean   : 201.0     Mean   : 197.5     Mean   : 192.7    
  vol_2g_mb_6        vol_2g_mb_7       vol_2g_mb_8        vol_2g_mb_9       vol_3g_mb_6     
 Min.   :    0.00   Min.   :   0.00   Min.   :    0.00   Min.   :   0.00   Min.   :    0.0  
 1st Qu.:    0.00   1st Qu.:   0.00   1st Qu.:    0.00   1st Qu.:   0.00   1st Qu.:    0.0  
 Median :    0.00   Median :   0.00   Median :    0.00   Median :   0.00   Median :    0.0  
 Mean   :   51.91   Mean   :  51.23   Mean   :   50.17   Mean   :  44.72   Mean   :  121.4  
  vol_3g_mb_7     vol_3g_mb_8       vol_3g_mb_9        arpu_3g_6         arpu_3g_7         arpu_3g_8      
 Min.   :    0   Min.   :    0.0   Min.   :    0.0   Min.   : -30.82   Min.   : -26.04   Min.   : -24.49  
 1st Qu.:    0   1st Qu.:    0.0   1st Qu.:    0.0   1st Qu.:   0.00   1st Qu.:   0.00   1st Qu.:   0.00  
 Median :    0   Median :    0.0   Median :    0.0   Median :   0.48   Median :   0.42   Median :   0.88  
 Mean   :  129   Mean   :  135.4   Mean   :  136.1   Mean   :  89.56   Mean   :  89.38   Mean   :  91.17  
   arpu_3g_9          arpu_2g_6         arpu_2g_7         arpu_2g_8         arpu_2g_9      
 Min.   :  -71.09   Min.   : -35.83   Min.   : -15.48   Min.   : -55.83   Min.   : -45.74  
 1st Qu.:    0.00   1st Qu.:   0.00   1st Qu.:   0.00   1st Qu.:   0.00   1st Qu.:   0.00  
 Median :    2.60   Median :  10.83   Median :   8.81   Median :   9.27   Median :  14.80  
 Mean   :  100.26   Mean   :  86.40   Mean   :  85.91   Mean   :  86.60   Mean   :  93.71  
 night_pck_user_6 night_pck_user_7 night_pck_user_8 night_pck_user_9  monthly_2g_6      monthly_2g_7    
 Min.   :0.00     Min.   :0.00     Min.   :0.00     Min.   :0.00     Min.   :0.00000   Min.   :0.00000  
 1st Qu.:0.00     1st Qu.:0.00     1st Qu.:0.00     1st Qu.:0.00     1st Qu.:0.00000   1st Qu.:0.00000  
 Median :0.00     Median :0.00     Median :0.00     Median :0.00     Median :0.00000   Median :0.00000  
 Mean   :0.03     Mean   :0.02     Mean   :0.02     Mean   :0.02     Mean   :0.07964   Mean   :0.08322  
  monthly_2g_8    monthly_2g_9      sachet_2g_6       sachet_2g_7       sachet_2g_8       sachet_2g_9     
 Min.   :0.000   Min.   :0.00000   Min.   : 0.0000   Min.   : 0.0000   Min.   : 0.0000   Min.   : 0.0000  
 1st Qu.:0.000   1st Qu.:0.00000   1st Qu.: 0.0000   1st Qu.: 0.0000   1st Qu.: 0.0000   1st Qu.: 0.0000  
 Median :0.000   Median :0.00000   Median : 0.0000   Median : 0.0000   Median : 0.0000   Median : 0.0000  
 Mean   :0.081   Mean   :0.06878   Mean   : 0.3894   Mean   : 0.4396   Mean   : 0.4501   Mean   : 0.3931  
  monthly_3g_6       monthly_3g_7       monthly_3g_8       monthly_3g_9       sachet_3g_6      
 Min.   : 0.00000   Min.   : 0.00000   Min.   : 0.00000   Min.   : 0.00000   Min.   : 0.00000  
 1st Qu.: 0.00000   1st Qu.: 0.00000   1st Qu.: 0.00000   1st Qu.: 0.00000   1st Qu.: 0.00000  
 Median : 0.00000   Median : 0.00000   Median : 0.00000   Median : 0.00000   Median : 0.00000  
 Mean   : 0.07592   Mean   : 0.07858   Mean   : 0.08294   Mean   : 0.08634   Mean   : 0.07478  
  sachet_3g_7       sachet_3g_8       sachet_3g_9         fb_user_6       fb_user_7       fb_user_8    
 Min.   : 0.0000   Min.   : 0.0000   Min.   : 0.00000   Min.   :0.00    Min.   :0.00    Min.   :0.00   
 1st Qu.: 0.0000   1st Qu.: 0.0000   1st Qu.: 0.00000   1st Qu.:1.00    1st Qu.:1.00    1st Qu.:1.00   
 Median : 0.0000   Median : 0.0000   Median : 0.00000   Median :1.00    Median :1.00    Median :1.00   
 Mean   : 0.0804   Mean   : 0.0845   Mean   : 0.08458   Mean   :0.91    Mean   :0.91    Mean   :0.89   
   fb_user_9          aon         aug_vbc_3g         jul_vbc_3g        jun_vbc_3g         sep_vbc_3g      
 Min.   :0.00    Min.   : 180   Min.   :    0.00   Min.   :   0.00   Min.   :    0.00   Min.   :   0.000  
 1st Qu.:1.00    1st Qu.: 467   1st Qu.:    0.00   1st Qu.:   0.00   1st Qu.:    0.00   1st Qu.:   0.000  
 Median :1.00    Median : 863   Median :    0.00   Median :   0.00   Median :    0.00   Median :   0.000  
 Mean   :0.86    Mean   :1220   Mean   :   68.17   Mean   :  66.84   Mean   :   60.02   Mean   :   3.299  
 [ reached getOption("max.print") -- omitted 3 rows ]

Let us find some columns where the column sums are zero. These columns have to be eliminated. To do that let us find those numeric columns

library(dplyr)
numCols = churnData %>% select_if(is.numeric) %>% colnames()

numChurn = churnData[,numCols]
head(numChurn)

Now let us find those columns whose sums equal 0 and then find those column names

zeroCols
 [1] "loc_og_t2o_mou"   "std_og_t2o_mou"   "loc_ic_t2o_mou"   "std_og_t2c_mou_6" "std_og_t2c_mou_7"
 [6] "std_og_t2c_mou_8" "std_og_t2c_mou_9" "std_ic_t2o_mou_6" "std_ic_t2o_mou_7" "std_ic_t2o_mou_8"
[11] "std_ic_t2o_mou_9"

Lets eliminate these columns from the data set

dim(numChurn)
[1] 99999   214
numChurn <- numChurn %>% select(-c(zeroCols))

dim(numChurn)
[1] 99999   203
head(numChurn)
summary(numChurn)
 mobile_number         circle_id       arpu_6             arpu_7             arpu_8        
 Min.   :7.000e+09   Min.   :109   Min.   :-2258.71   Min.   :-2014.05   Min.   : -945.81  
 1st Qu.:7.001e+09   1st Qu.:109   1st Qu.:   93.41   1st Qu.:   86.98   1st Qu.:   84.13  
 Median :7.001e+09   Median :109   Median :  197.70   Median :  191.64   Median :  192.08  
 Mean   :7.001e+09   Mean   :109   Mean   :  282.99   Mean   :  278.54   Mean   :  279.15  
     arpu_9          onnet_mou_6       onnet_mou_7       onnet_mou_8        onnet_mou_9      
 Min.   :-1899.51   Min.   :   0.00   Min.   :   0.00   Min.   :    0.00   Min.   :    0.00  
 1st Qu.:   62.69   1st Qu.:   7.38   1st Qu.:   6.66   1st Qu.:    6.46   1st Qu.:    5.33  
 Median :  176.85   Median :  34.31   Median :  32.33   Median :   32.36   Median :   29.84  
 Mean   :  261.65   Mean   : 132.40   Mean   : 133.67   Mean   :  133.02   Mean   :  130.30  
  offnet_mou_6      offnet_mou_7      offnet_mou_8       offnet_mou_9      roam_ic_mou_6     
 Min.   :   0.00   Min.   :   0.00   Min.   :    0.00   Min.   :    0.00   Min.   :    0.00  
 1st Qu.:  34.73   1st Qu.:  32.19   1st Qu.:   31.63   1st Qu.:   27.13   1st Qu.:    0.00  
 Median :  96.31   Median :  91.73   Median :   92.14   Median :   87.29   Median :    0.00  
 Mean   : 197.94   Mean   : 197.04   Mean   :  196.57   Mean   :  190.34   Mean   :    9.95  
 roam_ic_mou_7      roam_ic_mou_8       roam_ic_mou_9      roam_og_mou_6     roam_og_mou_7     
 Min.   :    0.00   Min.   :    0.000   Min.   :   0.000   Min.   :   0.00   Min.   :   0.000  
 1st Qu.:    0.00   1st Qu.:    0.000   1st Qu.:   0.000   1st Qu.:   0.00   1st Qu.:   0.000  
 Median :    0.00   Median :    0.000   Median :   0.000   Median :   0.00   Median :   0.000  
 Mean   :    7.15   Mean   :    7.293   Mean   :   6.344   Mean   :  13.91   Mean   :   9.819  
 roam_og_mou_8      roam_og_mou_9      loc_og_t2t_mou_6  loc_og_t2t_mou_7  loc_og_t2t_mou_8  
 Min.   :   0.000   Min.   :   0.000   Min.   :   0.00   Min.   :   0.00   Min.   :    0.00  
 1st Qu.:   0.000   1st Qu.:   0.000   1st Qu.:   1.66   1st Qu.:   1.63   1st Qu.:    1.60  
 Median :   0.000   Median :   0.000   Median :  11.91   Median :  11.61   Median :   11.73  
 Mean   :   9.972   Mean   :   8.556   Mean   :  47.10   Mean   :  46.47   Mean   :   45.89  
 loc_og_t2t_mou_9   loc_og_t2m_mou_6  loc_og_t2m_mou_7  loc_og_t2m_mou_8  loc_og_t2m_mou_9 
 Min.   :    0.00   Min.   :   0.00   Min.   :   0.00   Min.   :   0.00   Min.   :   0.00  
 1st Qu.:    1.36   1st Qu.:   9.88   1st Qu.:  10.03   1st Qu.:   9.81   1st Qu.:   8.81  
 Median :   11.26   Median :  41.03   Median :  40.43   Median :  40.36   Median :  39.12  
 Mean   :   44.58   Mean   :  93.34   Mean   :  91.40   Mean   :  91.75   Mean   :  90.46  
 loc_og_t2f_mou_6   loc_og_t2f_mou_7   loc_og_t2f_mou_8  loc_og_t2f_mou_9  loc_og_t2c_mou_6 
 Min.   :   0.000   Min.   :   0.000   Min.   :  0.000   Min.   :  0.000   Min.   :  0.000  
 1st Qu.:   0.000   1st Qu.:   0.000   1st Qu.:  0.000   1st Qu.:  0.000   1st Qu.:  0.000  
 Median :   0.000   Median :   0.000   Median :  0.000   Median :  0.000   Median :  0.000  
 Mean   :   3.751   Mean   :   3.793   Mean   :  3.678   Mean   :  3.655   Mean   :  1.123  
 loc_og_t2c_mou_7  loc_og_t2c_mou_8  loc_og_t2c_mou_9   loc_og_mou_6       loc_og_mou_7    
 Min.   :  0.000   Min.   :  0.000   Min.   :  0.000   Min.   :    0.00   Min.   :   0.00  
 1st Qu.:  0.000   1st Qu.:  0.000   1st Qu.:  0.000   1st Qu.:   17.11   1st Qu.:  17.48  
 Median :  0.000   Median :  0.000   Median :  0.000   Median :   65.11   Median :  63.69  
 Mean   :  1.369   Mean   :  1.434   Mean   :  1.233   Mean   :  144.20   Mean   : 141.67  
  loc_og_mou_8       loc_og_mou_9      std_og_t2t_mou_6  std_og_t2t_mou_7  std_og_t2t_mou_8 
 Min.   :    0.00   Min.   :    0.00   Min.   :   0.00   Min.   :   0.00   Min.   :   0.00  
 1st Qu.:   17.11   1st Qu.:   15.56   1st Qu.:   0.00   1st Qu.:   0.00   1st Qu.:   0.00  
 Median :   63.73   Median :   61.84   Median :   0.00   Median :   0.00   Median :   0.00  
 Mean   :  141.33   Mean   :  138.71   Mean   :  79.83   Mean   :  83.30   Mean   :  83.28  
 std_og_t2t_mou_9  std_og_t2m_mou_6  std_og_t2m_mou_7   std_og_t2m_mou_8   std_og_t2m_mou_9  
 Min.   :   0.00   Min.   :   0.00   Min.   :   0.000   Min.   :    0.00   Min.   :    0.00  
 1st Qu.:   0.00   1st Qu.:   0.00   1st Qu.:   0.000   1st Qu.:    0.00   1st Qu.:    0.00  
 Median :   0.00   Median :   3.95   Median :   3.635   Median :    3.31   Median :    2.50  
 Mean   :  82.34   Mean   :  87.30   Mean   :  90.804   Mean   :   89.84   Mean   :   86.28  
 std_og_t2f_mou_6  std_og_t2f_mou_7  std_og_t2f_mou_8  std_og_t2f_mou_9   std_og_mou_6    
 Min.   :  0.000   Min.   :  0.000   Min.   :  0.000   Min.   :  0.000   Min.   :   0.00  
 1st Qu.:  0.000   1st Qu.:  0.000   1st Qu.:  0.000   1st Qu.:  0.000   1st Qu.:   0.00  
 Median :  0.000   Median :  0.000   Median :  0.000   Median :  0.000   Median :  11.64  
 Mean   :  1.129   Mean   :  1.115   Mean   :  1.068   Mean   :  1.042   Mean   : 168.26  
  std_og_mou_7       std_og_mou_8       std_og_mou_9       isd_og_mou_6       isd_og_mou_7     
 Min.   :    0.00   Min.   :    0.00   Min.   :    0.00   Min.   :   0.000   Min.   :   0.000  
 1st Qu.:    0.00   1st Qu.:    0.00   1st Qu.:    0.00   1st Qu.:   0.000   1st Qu.:   0.000  
 Median :   11.09   Median :   10.41   Median :    8.41   Median :   0.000   Median :   0.000  
 Mean   :  175.22   Mean   :  174.19   Mean   :  169.66   Mean   :   0.798   Mean   :   0.777  
  isd_og_mou_8       isd_og_mou_9       spl_og_mou_6       spl_og_mou_7       spl_og_mou_8     
 Min.   :   0.000   Min.   :   0.000   Min.   :   0.000   Min.   :   0.000   Min.   :   0.000  
 1st Qu.:   0.000   1st Qu.:   0.000   1st Qu.:   0.000   1st Qu.:   0.000   1st Qu.:   0.000  
 Median :   0.000   Median :   0.000   Median :   0.000   Median :   0.000   Median :   0.000  
 Mean   :   0.791   Mean   :   0.724   Mean   :   3.917   Mean   :   4.978   Mean   :   5.054  
  spl_og_mou_9       og_others_6       og_others_7      og_others_8       og_others_9     
 Min.   :   0.000   Min.   :  0.000   Min.   :  0.00   Min.   :  0.000   Min.   :  0.000  
 1st Qu.:   0.000   1st Qu.:  0.000   1st Qu.:  0.00   1st Qu.:  0.000   1st Qu.:  0.000  
 Median :   0.000   Median :  0.000   Median :  0.00   Median :  0.000   Median :  0.000  
 Mean   :   4.413   Mean   :  0.454   Mean   :  0.03   Mean   :  0.033   Mean   :  0.047  
 total_og_mou_6     total_og_mou_7     total_og_mou_8     total_og_mou_9     loc_ic_t2t_mou_6 
 Min.   :    0.00   Min.   :    0.00   Min.   :    0.00   Min.   :    0.00   Min.   :   0.00  
 1st Qu.:   44.74   1st Qu.:   43.01   1st Qu.:   38.58   1st Qu.:   25.51   1st Qu.:   2.99  
 Median :  145.14   Median :  141.53   Median :  138.61   Median :  125.46   Median :  15.69  
 Mean   :  305.13   Mean   :  310.23   Mean   :  304.12   Mean   :  289.28   Mean   :  47.92  
 loc_ic_t2t_mou_7  loc_ic_t2t_mou_8   loc_ic_t2t_mou_9   loc_ic_t2m_mou_6  loc_ic_t2m_mou_7 
 Min.   :   0.00   Min.   :    0.00   Min.   :    0.00   Min.   :   0.00   Min.   :   0.00  
 1st Qu.:   3.23   1st Qu.:    3.28   1st Qu.:    3.29   1st Qu.:  17.29   1st Qu.:  18.59  
 Median :  15.74   Median :   16.03   Median :   15.66   Median :  56.49   Median :  57.08  
 Mean   :  47.99   Mean   :   47.21   Mean   :   46.28   Mean   : 107.48   Mean   : 107.12  
 loc_ic_t2m_mou_8  loc_ic_t2m_mou_9  loc_ic_t2f_mou_6  loc_ic_t2f_mou_7   loc_ic_t2f_mou_8 
 Min.   :   0.00   Min.   :   0.00   Min.   :   0.00   Min.   :   0.000   Min.   :   0.00  
 1st Qu.:  18.93   1st Qu.:  18.56   1st Qu.:   0.00   1st Qu.:   0.000   1st Qu.:   0.00  
 Median :  58.24   Median :  56.61   Median :   0.88   Median :   0.930   Median :   0.93  
 Mean   : 108.46   Mean   : 106.16   Mean   :  12.08   Mean   :  12.600   Mean   :  11.75  
 loc_ic_t2f_mou_9   loc_ic_mou_6      loc_ic_mou_7      loc_ic_mou_8       loc_ic_mou_9     
 Min.   :   0.00   Min.   :   0.00   Min.   :   0.00   Min.   :    0.00   Min.   :    0.00  
 1st Qu.:   0.00   1st Qu.:  30.39   1st Qu.:  32.46   1st Qu.:   32.74   1st Qu.:   32.29  
 Median :   0.96   Median :  92.16   Median :  92.55   Median :   93.83   Median :   91.64  
 Mean   :  12.17   Mean   : 167.49   Mean   : 167.72   Mean   :  167.43   Mean   :  164.62  
 std_ic_t2t_mou_6   std_ic_t2t_mou_7  std_ic_t2t_mou_8   std_ic_t2t_mou_9   std_ic_t2m_mou_6 
 Min.   :   0.000   Min.   :   0.00   Min.   :   0.000   Min.   :   0.000   Min.   :   0.00  
 1st Qu.:   0.000   1st Qu.:   0.00   1st Qu.:   0.000   1st Qu.:   0.000   1st Qu.:   0.00  
 Median :   0.000   Median :   0.00   Median :   0.000   Median :   0.000   Median :   2.03  
 Mean   :   9.576   Mean   :  10.01   Mean   :   9.884   Mean   :   9.432   Mean   :  20.72  
 std_ic_t2m_mou_7  std_ic_t2m_mou_8  std_ic_t2m_mou_9  std_ic_t2f_mou_6   std_ic_t2f_mou_7  
 Min.   :   0.00   Min.   :   0.00   Min.   :   0.00   Min.   :   0.000   Min.   :   0.000  
 1st Qu.:   0.00   1st Qu.:   0.00   1st Qu.:   0.00   1st Qu.:   0.000   1st Qu.:   0.000  
 Median :   2.04   Median :   2.03   Median :   1.74   Median :   0.000   Median :   0.000  
 Mean   :  21.66   Mean   :  21.18   Mean   :  19.62   Mean   :   2.156   Mean   :   2.217  
 std_ic_t2f_mou_8   std_ic_t2f_mou_9    std_ic_mou_6      std_ic_mou_7      std_ic_mou_8    
 Min.   :   0.000   Min.   :   0.000   Min.   :   0.00   Min.   :   0.00   Min.   :   0.00  
 1st Qu.:   0.000   1st Qu.:   0.000   1st Qu.:   0.00   1st Qu.:   0.00   1st Qu.:   0.01  
 Median :   0.000   Median :   0.000   Median :   5.89   Median :   5.96   Median :   5.88  
 Mean   :   2.085   Mean   :   2.173   Mean   :  32.46   Mean   :  33.89   Mean   :  33.16  
  std_ic_mou_9     total_ic_mou_6    total_ic_mou_7    total_ic_mou_8     total_ic_mou_9    
 Min.   :   0.00   Min.   :   0.00   Min.   :   0.00   Min.   :    0.00   Min.   :    0.00  
 1st Qu.:   0.00   1st Qu.:  38.53   1st Qu.:  41.19   1st Qu.:   38.29   1st Qu.:   32.37  
 Median :   5.38   Median : 114.74   Median : 116.34   Median :  114.66   Median :  105.89  
 Mean   :  31.23   Mean   : 200.13   Mean   : 202.85   Mean   :  198.75   Mean   :  189.21  
  spl_ic_mou_6     spl_ic_mou_7     spl_ic_mou_8    spl_ic_mou_9     isd_ic_mou_6       isd_ic_mou_7     
 Min.   : 0.000   Min.   : 0.000   Min.   : 0.00   Min.   : 0.000   Min.   :   0.000   Min.   :   0.000  
 1st Qu.: 0.000   1st Qu.: 0.000   1st Qu.: 0.00   1st Qu.: 0.000   1st Qu.:   0.000   1st Qu.:   0.000  
 Median : 0.000   Median : 0.000   Median : 0.00   Median : 0.000   Median :   0.000   Median :   0.000  
 Mean   : 0.062   Mean   : 0.034   Mean   : 0.04   Mean   : 0.163   Mean   :   7.461   Mean   :   8.335  
  isd_ic_mou_8       isd_ic_mou_9       ic_others_6        ic_others_7        ic_others_8      
 Min.   :   0.000   Min.   :   0.000   Min.   :   0.000   Min.   :   0.000   Min.   :   0.000  
 1st Qu.:   0.000   1st Qu.:   0.000   1st Qu.:   0.000   1st Qu.:   0.000   1st Qu.:   0.000  
 Median :   0.000   Median :   0.000   Median :   0.000   Median :   0.000   Median :   0.000  
 Mean   :   8.442   Mean   :   8.063   Mean   :   0.855   Mean   :   1.013   Mean   :   0.971  
  ic_others_9       total_rech_num_6  total_rech_num_7 total_rech_num_8  total_rech_num_9 
 Min.   :   0.000   Min.   :  0.000   Min.   :  0.0    Min.   :  0.000   Min.   :  0.000  
 1st Qu.:   0.000   1st Qu.:  3.000   1st Qu.:  3.0    1st Qu.:  3.000   1st Qu.:  3.000  
 Median :   0.000   Median :  6.000   Median :  6.0    Median :  5.000   Median :  5.000  
 Mean   :   1.017   Mean   :  7.559   Mean   :  7.7    Mean   :  7.213   Mean   :  6.893  
 total_rech_amt_6  total_rech_amt_7 total_rech_amt_8  total_rech_amt_9  max_rech_amt_6   max_rech_amt_7  
 Min.   :    0.0   Min.   :    0    Min.   :    0.0   Min.   :    0.0   Min.   :   0.0   Min.   :   0.0  
 1st Qu.:  109.0   1st Qu.:  100    1st Qu.:   90.0   1st Qu.:   52.0   1st Qu.:  30.0   1st Qu.:  30.0  
 Median :  230.0   Median :  220    Median :  225.0   Median :  200.0   Median : 110.0   Median : 110.0  
 Mean   :  327.5   Mean   :  323    Mean   :  324.2   Mean   :  303.4   Mean   : 104.6   Mean   : 104.8  
 max_rech_amt_8   max_rech_amt_9   last_day_rch_amt_6 last_day_rch_amt_7 last_day_rch_amt_8
 Min.   :   0.0   Min.   :   0.0   Min.   :   0.00    Min.   :   0.00    Min.   :   0.00   
 1st Qu.:  30.0   1st Qu.:  28.0   1st Qu.:   0.00    1st Qu.:   0.00    1st Qu.:   0.00   
 Median :  98.0   Median :  61.0   Median :  30.00    Median :  30.00    Median :  30.00   
 Mean   : 107.7   Mean   : 101.9   Mean   :  63.16    Mean   :  59.39    Mean   :  62.64   
 last_day_rch_amt_9 total_rech_data_6 total_rech_data_7 total_rech_data_8 total_rech_data_9
 Min.   :   0.0     Min.   : 1.00     Min.   : 1.00     Min.   : 1.00     Min.   : 1.00    
 1st Qu.:   0.0     1st Qu.: 1.00     1st Qu.: 1.00     1st Qu.: 1.00     1st Qu.: 1.00    
 Median :   0.0     Median : 1.00     Median : 1.00     Median : 1.00     Median : 2.00    
 Mean   :  43.9     Mean   : 2.46     Mean   : 2.67     Mean   : 2.65     Mean   : 2.44    
 max_rech_data_6  max_rech_data_7  max_rech_data_8  max_rech_data_9  count_rech_2g_6 count_rech_2g_7
 Min.   :   1.0   Min.   :   1.0   Min.   :   1.0   Min.   :   1.0   Min.   : 0.00   Min.   : 0.00  
 1st Qu.:  25.0   1st Qu.:  25.0   1st Qu.:  25.0   1st Qu.:  25.0   1st Qu.: 1.00   1st Qu.: 1.00  
 Median : 145.0   Median : 145.0   Median : 145.0   Median : 145.0   Median : 1.00   Median : 1.00  
 Mean   : 126.4   Mean   : 126.7   Mean   : 125.7   Mean   : 124.9   Mean   : 1.86   Mean   : 2.04  
 count_rech_2g_8 count_rech_2g_9 count_rech_3g_6 count_rech_3g_7 count_rech_3g_8 count_rech_3g_9
 Min.   : 0.00   Min.   : 0.00   Min.   : 0.0    Min.   : 0.00   Min.   : 0.00   Min.   : 0.00  
 1st Qu.: 1.00   1st Qu.: 1.00   1st Qu.: 0.0    1st Qu.: 0.00   1st Qu.: 0.00   1st Qu.: 0.00  
 Median : 1.00   Median : 1.00   Median : 0.0    Median : 0.00   Median : 0.00   Median : 0.00  
 Mean   : 2.02   Mean   : 1.78   Mean   : 0.6    Mean   : 0.62   Mean   : 0.64   Mean   : 0.66  
 av_rech_amt_data_6 av_rech_amt_data_7 av_rech_amt_data_8 av_rech_amt_data_9  vol_2g_mb_6      
 Min.   :   1.0     Min.   :   0.5     Min.   :   0.5     Min.   :   1.0     Min.   :    0.00  
 1st Qu.:  82.0     1st Qu.:  92.0     1st Qu.:  87.0     1st Qu.:  69.0     1st Qu.:    0.00  
 Median : 154.0     Median : 154.0     Median : 154.0     Median : 164.0     Median :    0.00  
 Mean   : 192.6     Mean   : 201.0     Mean   : 197.5     Mean   : 192.7     Mean   :   51.91  
  vol_2g_mb_7       vol_2g_mb_8        vol_2g_mb_9       vol_3g_mb_6       vol_3g_mb_7   
 Min.   :   0.00   Min.   :    0.00   Min.   :   0.00   Min.   :    0.0   Min.   :    0  
 1st Qu.:   0.00   1st Qu.:    0.00   1st Qu.:   0.00   1st Qu.:    0.0   1st Qu.:    0  
 Median :   0.00   Median :    0.00   Median :   0.00   Median :    0.0   Median :    0  
 Mean   :  51.23   Mean   :   50.17   Mean   :  44.72   Mean   :  121.4   Mean   :  129  
  vol_3g_mb_8       vol_3g_mb_9        arpu_3g_6         arpu_3g_7         arpu_3g_8      
 Min.   :    0.0   Min.   :    0.0   Min.   : -30.82   Min.   : -26.04   Min.   : -24.49  
 1st Qu.:    0.0   1st Qu.:    0.0   1st Qu.:   0.00   1st Qu.:   0.00   1st Qu.:   0.00  
 Median :    0.0   Median :    0.0   Median :   0.48   Median :   0.42   Median :   0.88  
 Mean   :  135.4   Mean   :  136.1   Mean   :  89.56   Mean   :  89.38   Mean   :  91.17  
   arpu_3g_9          arpu_2g_6         arpu_2g_7         arpu_2g_8         arpu_2g_9      
 Min.   :  -71.09   Min.   : -35.83   Min.   : -15.48   Min.   : -55.83   Min.   : -45.74  
 1st Qu.:    0.00   1st Qu.:   0.00   1st Qu.:   0.00   1st Qu.:   0.00   1st Qu.:   0.00  
 Median :    2.60   Median :  10.83   Median :   8.81   Median :   9.27   Median :  14.80  
 Mean   :  100.26   Mean   :  86.40   Mean   :  85.91   Mean   :  86.60   Mean   :  93.71  
 night_pck_user_6 night_pck_user_7 night_pck_user_8 night_pck_user_9  monthly_2g_6      monthly_2g_7    
 Min.   :0.00     Min.   :0.00     Min.   :0.00     Min.   :0.00     Min.   :0.00000   Min.   :0.00000  
 1st Qu.:0.00     1st Qu.:0.00     1st Qu.:0.00     1st Qu.:0.00     1st Qu.:0.00000   1st Qu.:0.00000  
 Median :0.00     Median :0.00     Median :0.00     Median :0.00     Median :0.00000   Median :0.00000  
 Mean   :0.03     Mean   :0.02     Mean   :0.02     Mean   :0.02     Mean   :0.07964   Mean   :0.08322  
  monthly_2g_8    monthly_2g_9      sachet_2g_6       sachet_2g_7       sachet_2g_8       sachet_2g_9     
 Min.   :0.000   Min.   :0.00000   Min.   : 0.0000   Min.   : 0.0000   Min.   : 0.0000   Min.   : 0.0000  
 1st Qu.:0.000   1st Qu.:0.00000   1st Qu.: 0.0000   1st Qu.: 0.0000   1st Qu.: 0.0000   1st Qu.: 0.0000  
 Median :0.000   Median :0.00000   Median : 0.0000   Median : 0.0000   Median : 0.0000   Median : 0.0000  
 Mean   :0.081   Mean   :0.06878   Mean   : 0.3894   Mean   : 0.4396   Mean   : 0.4501   Mean   : 0.3931  
  monthly_3g_6       monthly_3g_7       monthly_3g_8       monthly_3g_9       sachet_3g_6      
 Min.   : 0.00000   Min.   : 0.00000   Min.   : 0.00000   Min.   : 0.00000   Min.   : 0.00000  
 1st Qu.: 0.00000   1st Qu.: 0.00000   1st Qu.: 0.00000   1st Qu.: 0.00000   1st Qu.: 0.00000  
 Median : 0.00000   Median : 0.00000   Median : 0.00000   Median : 0.00000   Median : 0.00000  
 Mean   : 0.07592   Mean   : 0.07858   Mean   : 0.08294   Mean   : 0.08634   Mean   : 0.07478  
  sachet_3g_7       sachet_3g_8       sachet_3g_9         fb_user_6       fb_user_7       fb_user_8    
 Min.   : 0.0000   Min.   : 0.0000   Min.   : 0.00000   Min.   :0.00    Min.   :0.00    Min.   :0.00   
 1st Qu.: 0.0000   1st Qu.: 0.0000   1st Qu.: 0.00000   1st Qu.:1.00    1st Qu.:1.00    1st Qu.:1.00   
 Median : 0.0000   Median : 0.0000   Median : 0.00000   Median :1.00    Median :1.00    Median :1.00   
 Mean   : 0.0804   Mean   : 0.0845   Mean   : 0.08458   Mean   :0.91    Mean   :0.91    Mean   :0.89   
   fb_user_9          aon         aug_vbc_3g         jul_vbc_3g        jun_vbc_3g         sep_vbc_3g      
 Min.   :0.00    Min.   : 180   Min.   :    0.00   Min.   :   0.00   Min.   :    0.00   Min.   :   0.000  
 1st Qu.:1.00    1st Qu.: 467   1st Qu.:    0.00   1st Qu.:   0.00   1st Qu.:    0.00   1st Qu.:   0.000  
 Median :1.00    Median : 863   Median :    0.00   Median :   0.00   Median :    0.00   Median :   0.000  
 Mean   :0.86    Mean   :1220   Mean   :   68.17   Mean   :  66.84   Mean   :   60.02   Mean   :   3.299  
 [ reached getOption("max.print") -- omitted 3 rows ]

Let us look at duplicates in the mobile number column

Let us now create the target variable which is the indicator for churn.

# Consolidating the internet data for Sept month
numChurn$SepInternet <- numChurn$vol_2g_mb_9 + numChurn$vol_3g_mb_9

The customers who have no call and internet data in the Sept month would be the ones who have churned

The next task is to find the relationship between revenue and the possibility of churn.

Hypothesis 1. Too much flux in the revenue can indicate propensity to churn

Let us look at cases where the standard deviation is above 5

churnSamp2_tran %>% filter(SD > 5) %>% mutate(Per = sum(target)/n()) %>% select(Per) %>% summarise(Mn = mean(Per,na.rm = TRUE))
NA
NA
NA

The number of customers who are likely to churn in the high sd range is almost 3 times the normal zone

Let us now look at the distribution of the sD

churnSamp2_tran %>% ggplot(aes(x= SD)) + geom_density()


# Mapping the quantile values also
quantile(churnSamp2_tran$SD, c(.05, .15,.25,.5,.6,.75,.85, .98))
        5%        15%        25%        50%        60%        75%        85%        98% 
0.04131759 0.08230600 0.12069221 0.23162946 0.29212411 0.42642087 0.58915619 1.43418310 

Let us plot some tables based on these bins and see the % of customers within these bins

churnSamp2_tran %>% filter(SD < 0.05709328 ) %>% mutate(Per = sum(target)/n()) %>% select(Per) %>% summarise(NUm = n(),Mn = mean(Per,na.rm = TRUE))

churnSamp2_tran %>% filter(SD >= 0.05709328 & SD < 0.10041949  ) %>% mutate(Per = sum(target)/n()) %>% select(Per) %>% summarise(NUm = n(),Mn = mean(Per,na.rm = TRUE))

churnSamp2_tran %>% filter(SD >= 0.10041949 & SD < 0.13878567   ) %>% mutate(Per = sum(target)/n()) %>% select(Per) %>% summarise(NUm = n(),Mn = mean(Per,na.rm = TRUE))

churnSamp2_tran %>% filter(SD >= 0.13878567  & SD < 0.25155975   ) %>% mutate(Per = sum(target)/n()) %>% select(Per) %>% summarise(NUm = n(),Mn = mean(Per,na.rm = TRUE))

churnSamp2_tran %>% filter(SD >= 0.25155975  & SD < 0.31318986   ) %>% mutate(Per = sum(target)/n()) %>% select(Per) %>% summarise(NUm = n(),Mn = mean(Per,na.rm = TRUE))

churnSamp2_tran %>% filter(SD >= 0.31318986  & SD < 0.44807817   ) %>% mutate(Per = sum(target)/n()) %>% select(Per) %>% summarise(NUm = n(),Mn = mean(Per,na.rm = TRUE))

churnSamp2_tran %>% filter(SD >= 0.44807817  & SD < 0.61230192   ) %>% mutate(Per = sum(target)/n()) %>% select(Per) %>% summarise(NUm = n(),Mn = mean(Per,na.rm = TRUE))

churnSamp2_tran %>% filter(SD >= 0.61230192  & SD < 1.43997168    ) %>% mutate(Per = sum(target)/n()) %>% select(Per) %>% summarise(NUm = n(),Mn = mean(Per,na.rm = TRUE))

churnSamp2_tran %>% filter(SD >= 1.43997168) %>% mutate(Per = sum(target)/n()) %>% select(Per) %>% summarise(Mn = mean(Per,na.rm = TRUE),NUm = n())
NA

Feature Engineering 1 :

Creating the standard deviation of the arpu accross months 6 to 8 seems to be a good indicator

head(numChurn)

Hypothesis 2:

Let us look at the on network mou. My hypothesis is there shouldnt be any change in the on network mou as to whether a customer is churning or not

# take a sample of only the required variables
churnSamp1_hyp2 <- numChurn %>% select(mobile_number,offnet_mou_6,offnet_mou_7,offnet_mou_8,target)

# let us create a new sample to take only the ARPu figures to take row wise standard deviation

churnSamp2_hyp2 <- churnSamp1_hyp2 %>% select(offnet_mou_6,offnet_mou_7,offnet_mou_8)

churnSamp2_hyp2[is.na(churnSamp2_hyp2)] <- 0

# Scaling the data

library(caret)

pp = preProcess(churnSamp2_hyp2,method = 'scale')
churnSamp2_hyp2 = predict(pp,churnSamp2_hyp2)
churnSamp2_hyp2
NA
churnSamp2_hyp2 <- transform(churnSamp2_hyp2,SD = apply(churnSamp2_hyp2,1,sd,na.rm = TRUE))

churnSamp2_hyp2$mobile <- churnData$mobile_number
churnSamp2_hyp2$target <- numChurn$target
head(churnSamp2_hyp2)
# Mapping the quantile values also
quantile(churnSamp2_hyp2$SD, c(.05, .15,.25,.5,.6,.75,.85, .95,.99))
          5%          15%          25%          50%          60%          75%          85%          95% 
0.0007897178 0.0099430038 0.0207226499 0.0641469656 0.0966209515 0.1959115512 0.3696960453 1.0014883183 
         99% 
2.3819037846 
churnSamp2_hyp2 %>% filter(SD < 0.0007897178  ) %>% mutate(Per = sum(target)/n()) %>% select(Per) %>% summarise(NUm = n(),Mn = mean(Per,na.rm = TRUE))

churnSamp2_hyp2 %>% filter(SD >= 0.0007897178  & SD < 0.0099430038   ) %>% mutate(Per = sum(target)/n()) %>% select(Per) %>% summarise(NUm = n(),Mn = mean(Per,na.rm = TRUE))

churnSamp2_hyp2 %>% filter(SD >= 0.0099430038  & SD < 0.0207226499    ) %>% mutate(Per = sum(target)/n()) %>% select(Per) %>% summarise(NUm = n(),Mn = mean(Per,na.rm = TRUE))

churnSamp2_hyp2 %>% filter(SD >= 0.0207226499   & SD < 0.0641469656    ) %>% mutate(Per = sum(target)/n()) %>% select(Per) %>% summarise(NUm = n(),Mn = mean(Per,na.rm = TRUE))

churnSamp2_hyp2 %>% filter(SD >= 0.0641469656 & SD < 0.0966209515    ) %>% mutate(Per = sum(target)/n()) %>% select(Per) %>% summarise(NUm = n(),Mn = mean(Per,na.rm = TRUE))

churnSamp2_hyp2 %>% filter(SD >= 0.0966209515   & SD < 0.1959115512    ) %>% mutate(Per = sum(target)/n()) %>% select(Per) %>% summarise(NUm = n(),Mn = mean(Per,na.rm = TRUE))

churnSamp2_hyp2 %>% filter(SD >= 0.1959115512   & SD < 0.3696960453    ) %>% mutate(Per = sum(target)/n()) %>% select(Per) %>% summarise(NUm = n(),Mn = mean(Per,na.rm = TRUE))

churnSamp2_hyp2 %>% filter(SD >= 0.3696960453   & SD < 1.0014883183     ) %>% mutate(Per = sum(target)/n()) %>% select(Per) %>% summarise(NUm = n(),Mn = mean(Per,na.rm = TRUE))

churnSamp2_hyp2 %>% filter(SD >= 1.0014883183   & SD < 2.3819037846      ) %>% mutate(Per = sum(target)/n()) %>% select(Per) %>% summarise(NUm = n(),Mn = mean(Per,na.rm = TRUE))

churnSamp2_hyp2 %>% filter(SD >= 2.3819037846 ) %>% mutate(Per = sum(target)/n()) %>% select(Per) %>% summarise(Mn = mean(Per,na.rm = TRUE),NUm = n())

The behaviour with respect to network usage is found to be opposite of the behaviour which was found for average revenue.

Both the onnet and offnet usage behaviour has a parabolic relationship with churn.

Let us look for other relationships

churnData[1:10,]

Let u slook at roaming incoming and roaming outgoing relationships

Creating a function to do the job




scalerFun <- function(var1,var2,var3){
  
 # take a sample of only the required variables
churnSamp1_hyp2 <- numChurn %>% select(mobile_number,var1,var2,var3)

# let us create a new sample to take only the ARPu figures to take row wise standard deviation

churnSamp2_hyp2 <- churnSamp1_hyp2 %>% select(var1,var2,var3)

churnSamp2_hyp2[is.na(churnSamp2_hyp2)] <- 0

# Scaling the data

pp = preProcess(churnSamp2_hyp2,method = 'scale')
churnSamp2_hyp2 = predict(pp,churnSamp2_hyp2)

churnSamp2_hyp2 <- transform(churnSamp2_hyp2,SD = apply(churnSamp2_hyp2,1,sd,na.rm = TRUE))

churnSamp2_hyp2$mobile <- churnData$mobile_number
churnSamp2_hyp2$target <- numChurn$target
churnSamp2_hyp2


# Quantile mapping

quantvals <- quantile(churnSamp2_hyp2$SD, c(.05, .15,.25,.5,.6,.75,.85, .95,.99),na.rm = TRUE)

val1 <- churnSamp2_hyp2 %>% filter(SD < quantvals[1]  ) %>% mutate(Per = sum(target)/n()) %>% select(Per) %>% summarise(NUm = n(),Mn = mean(Per,na.rm = TRUE))

val2 <-churnSamp2_hyp2 %>% filter(SD >= quantvals[1]  & SD < quantvals[2]   ) %>% mutate(Per = sum(target)/n()) %>% select(Per) %>% summarise(NUm = n(),Mn = mean(Per,na.rm = TRUE))

val3 <- churnSamp2_hyp2 %>% filter(SD >= quantvals[2]  & SD < quantvals[3]   ) %>% mutate(Per = sum(target)/n()) %>% select(Per) %>% summarise(NUm = n(),Mn = mean(Per,na.rm = TRUE))

val4 <-churnSamp2_hyp2 %>% filter(SD >= quantvals[3]   & SD < quantvals[4]   ) %>% mutate(Per = sum(target)/n()) %>% select(Per) %>% summarise(NUm = n(),Mn = mean(Per,na.rm = TRUE))

val5 <-churnSamp2_hyp2 %>% filter(SD >= quantvals[4] & SD < quantvals[5]    ) %>% mutate(Per = sum(target)/n()) %>% select(Per) %>% summarise(NUm = n(),Mn = mean(Per,na.rm = TRUE))

val6 <-churnSamp2_hyp2 %>% filter(SD >= quantvals[5]   & SD < quantvals[6]    ) %>% mutate(Per = sum(target)/n()) %>% select(Per) %>% summarise(NUm = n(),Mn = mean(Per,na.rm = TRUE))

val7 <-churnSamp2_hyp2 %>% filter(SD >= quantvals[6]   & SD < quantvals[7]    ) %>% mutate(Per = sum(target)/n()) %>% select(Per) %>% summarise(NUm = n(),Mn = mean(Per,na.rm = TRUE))

val8 <-churnSamp2_hyp2 %>% filter(SD >= quantvals[7]   & SD < quantvals[8]    ) %>% mutate(Per = sum(target)/n()) %>% select(Per) %>% summarise(NUm = n(),Mn = mean(Per,na.rm = TRUE))

val9 <-churnSamp2_hyp2 %>% filter(SD >= quantvals[8]   & SD < quantvals[9]      ) %>% mutate(Per = sum(target)/n()) %>% select(Per) %>% summarise(NUm = n(),Mn = mean(Per,na.rm = TRUE))

val10 <-churnSamp2_hyp2 %>% filter(SD >= quantvals[9] ) %>% mutate(Per = sum(target)/n()) %>% select(Per) %>% summarise(NUm = n(),Mn = mean(Per,na.rm = TRUE))

l1 = list(df1=churnSamp2_hyp2,val1=val1,val2=val2,val3=val3,val4=val4,val5=val5,val6=val6,val7=val7,val8=val8,val9=val9,val10=val10)

l1  

}

Running the function for roaming values

roamSamp <- scalerFun('roam_ic_mou_6','roam_ic_mou_7','roam_ic_mou_8')
roamSamp$df1
roamSamp$val1
roamSamp$val2
roamSamp$val3
roamSamp$val4
roamSamp$val5
roamSamp$val6
roamSamp$val7
roamSamp$val8
roamSamp$val9
roamSamp$val10
NA
NA
NA

Result : Roaming.

Roaming also is found to have the same behaviour as the other variables. The highest quantile values shows the maximum propensity to churn.

Roaming Outgoing

# make an empty data frame 

churnFeat1 <- data.frame(matrix( nrow = 99999, ncol = 0))


churnFeat1 <- cbind(churnFeat1,roamSamp$df1$SD)



colnames(churnFeat1) <- c('roam_ic_SD')

head(churnFeat1)
NA

roamSamp <- scalerFun('roam_og_mou_6','roam_og_mou_7','roam_og_mou_8')
roamSamp$df1
roamSamp$val1
roamSamp$val2
roamSamp$val3
roamSamp$val4
roamSamp$val5
roamSamp$val6
roamSamp$val7
roamSamp$val8
roamSamp$val9
roamSamp$val10

churnFeat1 <- cbind(churnFeat1,roamSamp$df1$SD)



colnames(churnFeat1) <- c('roam_ic_SD','roam_og_SD')

head(churnFeat1)
NA

Location outgoing same telecom provider

roamSamp <- scalerFun('loc_og_t2t_mou_6','loc_og_t2t_mou_7','loc_og_t2t_mou_8')
roamSamp$df1
roamSamp$val1
roamSamp$val2
roamSamp$val3
roamSamp$val4
roamSamp$val5
roamSamp$val6
roamSamp$val7
roamSamp$val8
roamSamp$val9
roamSamp$val10

churnFeat1 <- cbind(churnFeat1,roamSamp$df1$SD)



colnames(churnFeat1) <- c('roam_ic_SD','roam_og_SD','loc_og_t2t_SD')

head(churnFeat1)
NA

Local calls within the same network within the network of the same telecom operator shows a reverse trend where low flex zone has higher probability of finding churn cases.

Local calls from operator to mobile of other operator

roamSamp <- scalerFun('loc_og_t2m_mou_6','loc_og_t2m_mou_7','loc_og_t2m_mou_8')
roamSamp$df1
roamSamp$val1
roamSamp$val2
roamSamp$val3
roamSamp$val4
roamSamp$val5
roamSamp$val6
roamSamp$val7
roamSamp$val8
roamSamp$val9
roamSamp$val10

churnFeat1 <- cbind(churnFeat1,roamSamp$df1$SD)



colnames(churnFeat1) <- c('roam_ic_SD','roam_og_SD','loc_og_t2t_SD','loc_og_t2m_SD')

head(churnFeat1)

The proportion of the churn cases are more in the lower ranges of standard deviation

Operator to fixed lines of the operator, outgoing

roamSamp <- scalerFun('loc_og_t2f_mou_6','loc_og_t2f_mou_7','loc_og_t2f_mou_8')
roamSamp$df1
roamSamp$val1
roamSamp$val2
roamSamp$val3
roamSamp$val4
roamSamp$val5
roamSamp$val6
roamSamp$val7
roamSamp$val8
roamSamp$val9
roamSamp$val10

churnFeat1 <- cbind(churnFeat1,roamSamp$df1$SD)



colnames(churnFeat1) <- c('roam_ic_SD','roam_og_SD','loc_og_t2t_SD','loc_og_t2m_SD','loc_og_t2f_SD')

head(churnFeat1)
NA

Not much information in this feature.

Operator to its own call centre

Do calls to ones call centre indicate a propensity for churn ?

roamSamp <- scalerFun('loc_og_t2c_mou_6','loc_og_t2c_mou_7','loc_og_t2c_mou_8')
roamSamp$df1
roamSamp$val1
roamSamp$val2
roamSamp$val3
roamSamp$val4
roamSamp$val5
roamSamp$val6
roamSamp$val7
roamSamp$val8
roamSamp$val9
roamSamp$val10

churnFeat1 <- cbind(churnFeat1,roamSamp$df1$SD)



colnames(churnFeat1) <- c('roam_ic_SD','roam_og_SD','loc_og_t2t_SD','loc_og_t2m_SD','loc_og_t2f_SD','loc_og_t2c_SD')

head(churnFeat1)
NA

Not much information in this data point.

Local outgoing

roamSamp <- scalerFun('loc_og_mou_6','loc_og_mou_7','loc_og_mou_8')
roamSamp$df1
roamSamp$val1
roamSamp$val2
roamSamp$val3
roamSamp$val4
roamSamp$val5
roamSamp$val6
roamSamp$val7
roamSamp$val8
roamSamp$val9
roamSamp$val10

churnFeat1 <- cbind(churnFeat1,roamSamp$df1$SD)



colnames(churnFeat1) <- c('roam_ic_SD','roam_og_SD','loc_og_t2t_SD','loc_og_t2m_SD','loc_og_t2f_SD','loc_og_t2c_SD','loc_og_SD')

head(churnFeat1)
NA

Lower range of this has around 40% of churn cases.

STD outgoing inter operator calls.

roamSamp <- scalerFun('std_og_t2t_mou_6','std_og_t2t_mou_7','std_og_t2t_mou_8')
roamSamp$df1
roamSamp$val1
roamSamp$val2
roamSamp$val3
roamSamp$val4
roamSamp$val5
roamSamp$val6
roamSamp$val7
roamSamp$val8
roamSamp$val9
roamSamp$val10

churnFeat1 <- cbind(churnFeat1,roamSamp$df1$SD)



colnames(churnFeat1) <- c('roam_ic_SD','roam_og_SD','loc_og_t2t_SD','loc_og_t2m_SD','loc_og_t2f_SD','loc_og_t2c_SD','loc_og_SD','std_og_t2t_SD')

head(churnFeat1)
NA

The higher end of the spectrum shows the highest propensity to churn.Top three bands of the standard deviation has the highest propensity.

STD outgoing Operator to another operator mobile.

roamSamp <- scalerFun('std_og_t2m_mou_6','std_og_t2m_mou_7','std_og_t2m_mou_8')
roamSamp$df1
roamSamp$val1
roamSamp$val2
roamSamp$val3
roamSamp$val4
roamSamp$val5
roamSamp$val6
roamSamp$val7
roamSamp$val8
roamSamp$val9
roamSamp$val10

churnFeat1 <- cbind(churnFeat1,roamSamp$df1$SD)



colnames(churnFeat1) <- c('roam_ic_SD','roam_og_SD','loc_og_t2t_SD','loc_og_t2m_SD','loc_og_t2f_SD','loc_og_t2c_SD','loc_og_SD','std_og_t2t_SD','std_og_t2m_SD')

head(churnFeat1)
NA

The top end of the spectrum has the heighest propensity of churn.

STD outgoing from same operator to fixed line

roamSamp <- scalerFun('std_og_t2f_mou_6','std_og_t2f_mou_7','std_og_t2f_mou_8')
roamSamp$df1
roamSamp$val1
roamSamp$val2
roamSamp$val3
roamSamp$val4
roamSamp$val5
roamSamp$val6
roamSamp$val7
roamSamp$val8
roamSamp$val9
roamSamp$val10

churnFeat1 <- cbind(churnFeat1,roamSamp$df1$SD)



colnames(churnFeat1) <- c('roam_ic_SD','roam_og_SD','loc_og_t2t_SD','loc_og_t2m_SD','loc_og_t2f_SD','loc_og_t2c_SD','loc_og_SD','std_og_t2t_SD','std_og_t2m_SD','std_og_t2f_SD')

head(churnFeat1)
NA

As expected the flux in fixed lines dosent present any meaningful indicator at all.

STD outgoing consolidated

roamSamp <- scalerFun('std_og_mou_6','std_og_mou_7','std_og_mou_8')
roamSamp$df1
roamSamp$val1
roamSamp$val2
roamSamp$val3
roamSamp$val4
roamSamp$val5
roamSamp$val6
roamSamp$val7
roamSamp$val8
roamSamp$val9
roamSamp$val10
churnFeat1 <- cbind(churnFeat1,roamSamp$df1$SD)



colnames(churnFeat1) <- c('roam_ic_SD','roam_og_SD','loc_og_t2t_SD','loc_og_t2m_SD','loc_og_t2f_SD','loc_og_t2c_SD','loc_og_SD','std_og_t2t_SD','std_og_t2m_SD','std_og_t2f_SD','std_og_SD')

head(churnFeat1)
NA

There is a mild parabolic representation with the top standard deviation values having the higher probability of churn propensity.

ISD outgoing


roamSamp <- scalerFun('isd_og_mou_6','isd_og_mou_7','isd_og_mou_8')
roamSamp$df1
roamSamp$val1
roamSamp$val2
roamSamp$val3
roamSamp$val4
roamSamp$val5
roamSamp$val6
roamSamp$val7
roamSamp$val8
roamSamp$val9
roamSamp$val10

churnFeat1 <- cbind(churnFeat1,roamSamp$df1$SD)



colnames(churnFeat1) <- c('roam_ic_SD','roam_og_SD','loc_og_t2t_SD','loc_og_t2m_SD','loc_og_t2f_SD','loc_og_t2c_SD','loc_og_SD','std_og_t2t_SD','std_og_t2m_SD','std_og_t2f_SD','std_og_SD','isd_og_SD')

head(churnFeat1)
NA

The highest band has the greatest probability of finding churn.

Special outgoing calls

roamSamp <- scalerFun('spl_og_mou_6','spl_og_mou_7','spl_og_mou_8')
roamSamp$df1
roamSamp$val1
roamSamp$val2
roamSamp$val3
roamSamp$val4
roamSamp$val5
roamSamp$val6
roamSamp$val7
roamSamp$val8
roamSamp$val9
roamSamp$val10

churnFeat1 <- cbind(churnFeat1,roamSamp$df1$SD)



colnames(churnFeat1) <- c('roam_ic_SD','roam_og_SD','loc_og_t2t_SD','loc_og_t2m_SD','loc_og_t2f_SD','loc_og_t2c_SD','loc_og_SD','std_og_t2t_SD','std_og_t2m_SD','std_og_t2f_SD','std_og_SD','isd_og_SD','spl_og_SD')

head(churnFeat1)
NA

Not much difference in this segment.

outgoing others

roamSamp <- scalerFun('og_others_6','og_others_7','og_others_8')
roamSamp$df1
roamSamp$val1
roamSamp$val2
roamSamp$val3
roamSamp$val4
roamSamp$val5
roamSamp$val6
roamSamp$val7
roamSamp$val8
roamSamp$val9
roamSamp$val10

churnFeat1 <- cbind(churnFeat1,roamSamp$df1$SD)



colnames(churnFeat1) <- c('roam_ic_SD','roam_og_SD','loc_og_t2t_SD','loc_og_t2m_SD','loc_og_t2f_SD','loc_og_t2c_SD','loc_og_SD','std_og_t2t_SD','std_og_t2m_SD','std_og_t2f_SD','std_og_SD','isd_og_SD','spl_og_SD','og_others_SD')

head(churnFeat1)

The top one has the most propensity. However not much to talk about.

Consolidate outgoing trend

roamSamp <- scalerFun('total_og_mou_6','total_og_mou_7','total_og_mou_8')
roamSamp$df1
roamSamp$val1
roamSamp$val2
roamSamp$val3
roamSamp$val4
roamSamp$val5
roamSamp$val6
roamSamp$val7
roamSamp$val8
roamSamp$val9
roamSamp$val10

churnFeat1 <- cbind(churnFeat1,roamSamp$df1$SD)



colnames(churnFeat1) <- c('roam_ic_SD','roam_og_SD','loc_og_t2t_SD','loc_og_t2m_SD','loc_og_t2f_SD','loc_og_t2c_SD','loc_og_SD','std_og_t2t_SD','std_og_t2m_SD','std_og_t2f_SD','std_og_SD','isd_og_SD','spl_og_SD','og_others_SD','total_og_SD')

head(churnFeat1)
NA

There is a parabolic relationsip. With some of the highest representation at the bottom end of the std range. The top also showing some propensity for the same. The bottom end must be heavily influenced by some of the 40% range features.

Local incoming calls within the same telecom network

roamSamp <- scalerFun('loc_ic_t2t_mou_6','loc_ic_t2t_mou_7','loc_ic_t2t_mou_8')
roamSamp$df1
roamSamp$val1
roamSamp$val2
roamSamp$val3
roamSamp$val4
roamSamp$val5
roamSamp$val6
roamSamp$val7
roamSamp$val8
roamSamp$val9
roamSamp$val10

churnFeat1 <- cbind(churnFeat1,roamSamp$df1$SD)



colnames(churnFeat1) <- c('roam_ic_SD','roam_og_SD','loc_og_t2t_SD','loc_og_t2m_SD','loc_og_t2f_SD','loc_og_t2c_SD','loc_og_SD','std_og_t2t_SD','std_og_t2m_SD','std_og_t2f_SD','std_og_SD','isd_og_SD','spl_og_SD','og_others_SD','total_og_SD','loc_ic_t2t_SD')

head(churnFeat1)
NA

The bottom 15000 cases has the highest propensity for churn 24%

Local incoming operator to different mobile network

The bottom has a very high percentage of churn about 43%.

##Local incoming telecom operator to a fixed line

roamSamp <- scalerFun('loc_ic_t2f_mou_6','loc_ic_t2f_mou_7','loc_ic_t2f_mou_8')
roamSamp$df1
roamSamp$val1
roamSamp$val2
roamSamp$val3
roamSamp$val4
roamSamp$val5
roamSamp$val6
roamSamp$val7
roamSamp$val8
roamSamp$val9
roamSamp$val10

churnFeat1 <- cbind(churnFeat1,roamSamp$df1$SD)



colnames(churnFeat1) <- c('roam_ic_SD','roam_og_SD','loc_og_t2t_SD','loc_og_t2m_SD','loc_og_t2f_SD','loc_og_t2c_SD','loc_og_SD','std_og_t2t_SD','std_og_t2m_SD','std_og_t2f_SD','std_og_SD','isd_og_SD','spl_og_SD','og_others_SD','total_og_SD','loc_ic_t2t_SD','loc_ic_t2m_SD','loc_ic_t2f_SD')

head(churnFeat1)
NA

The bottom layer has the highest propensity for churn.

Local Incoming

roamSamp <- scalerFun('loc_ic_mou_6','loc_ic_mou_7','loc_ic_mou_8')
roamSamp$df1
roamSamp$val1
roamSamp$val2
roamSamp$val3
roamSamp$val4
roamSamp$val5
roamSamp$val6
roamSamp$val7
roamSamp$val8
roamSamp$val9
roamSamp$val10
churnFeat1 <- cbind(churnFeat1,roamSamp$df1$SD)



colnames(churnFeat1) <- c('roam_ic_SD','roam_og_SD','loc_og_t2t_SD','loc_og_t2m_SD','loc_og_t2f_SD','loc_og_t2c_SD','loc_og_SD','std_og_t2t_SD','std_og_t2m_SD','std_og_t2f_SD','std_og_SD','isd_og_SD','spl_og_SD','og_others_SD','total_og_SD','loc_ic_t2t_SD','loc_ic_t2m_SD','loc_ic_t2f_SD','loc_ic_SD')

head(churnFeat1)

The bottom 5000 which has the least standard deviation has the higher proportion of churn with 42%.

STD incoming within the same network


roamSamp <- scalerFun('std_ic_t2t_mou_6','std_ic_t2t_mou_7','std_ic_t2t_mou_8')
roamSamp$df1
roamSamp$val1
roamSamp$val2
roamSamp$val3
roamSamp$val4
roamSamp$val5
roamSamp$val6
roamSamp$val7
roamSamp$val8
roamSamp$val9
roamSamp$val10

churnFeat1 <- cbind(churnFeat1,roamSamp$df1$SD)



colnames(churnFeat1) <- c('roam_ic_SD','roam_og_SD','loc_og_t2t_SD','loc_og_t2m_SD','loc_og_t2f_SD','loc_og_t2c_SD','loc_og_SD','std_og_t2t_SD','std_og_t2m_SD','std_og_t2f_SD','std_og_SD','isd_og_SD','spl_og_SD','og_others_SD','total_og_SD','loc_ic_t2t_SD','loc_ic_t2m_SD','loc_ic_t2f_SD','loc_ic_SD','std_ic_t2t_SD')

head(churnFeat1)
NA

STD incoming dosent have much of a differentiation and the churn percentage is evenly distributed.

STD incoming within network from mobile of other operator

roamSamp <- scalerFun('std_ic_t2m_mou_6','std_ic_t2m_mou_7','std_ic_t2m_mou_8')
roamSamp$df1
roamSamp$val1
roamSamp$val2
roamSamp$val3
roamSamp$val4
roamSamp$val5
roamSamp$val6
roamSamp$val7
roamSamp$val8
roamSamp$val9
roamSamp$val10

roamSamp <- scalerFun('std_ic_t2t_mou_6','std_ic_t2t_mou_7','std_ic_t2t_mou_8')
roamSamp$df1
roamSamp$val1
roamSamp$val2
roamSamp$val3
roamSamp$val4
roamSamp$val5
roamSamp$val6
roamSamp$val7
roamSamp$val8
roamSamp$val9
roamSamp$val10

churnFeat1 <- cbind(churnFeat1,roamSamp$df1$SD)



colnames(churnFeat1) <- c('roam_ic_SD','roam_og_SD','loc_og_t2t_SD','loc_og_t2m_SD','loc_og_t2f_SD','loc_og_t2c_SD','loc_og_SD','std_og_t2t_SD','std_og_t2m_SD','std_og_t2f_SD','std_og_SD','isd_og_SD','spl_og_SD','og_others_SD','total_og_SD','loc_ic_t2t_SD','loc_ic_t2m_SD','loc_ic_t2f_SD','loc_ic_SD','std_ic_t2t_SD','std_ic_t2m_SD')

head(churnFeat1)
NA

This is a parabolic distribution with the maximum propensity with the bottom band and high band. However the difference between bands is not that pronounced

STD incoming from fixed line to the operator

roamSamp <- scalerFun('std_ic_t2f_mou_6','std_ic_t2f_mou_7','std_ic_t2f_mou_8')
roamSamp$df1
roamSamp$val1
roamSamp$val2
roamSamp$val3
roamSamp$val4
roamSamp$val5
roamSamp$val6
roamSamp$val7
roamSamp$val8
roamSamp$val9
roamSamp$val10
churnFeat1 <- cbind(churnFeat1,roamSamp$df1$SD)



colnames(churnFeat1) <- c('roam_ic_SD','roam_og_SD','loc_og_t2t_SD','loc_og_t2m_SD','loc_og_t2f_SD','loc_og_t2c_SD','loc_og_SD','std_og_t2t_SD','std_og_t2m_SD','std_og_t2f_SD','std_og_SD','isd_og_SD','spl_og_SD','og_others_SD','total_og_SD','loc_ic_t2t_SD','loc_ic_t2m_SD','loc_ic_t2f_SD','loc_ic_SD','std_ic_t2t_SD','std_ic_t2m_SD','std_ic_t2f_SD')

head(churnFeat1)

Not much of differentiation

Total STD incoming

roamSamp <- scalerFun('std_ic_mou_6','std_ic_mou_7','std_ic_mou_8')
roamSamp$df1
roamSamp$val1
roamSamp$val2
roamSamp$val3
roamSamp$val4
roamSamp$val5
roamSamp$val6
roamSamp$val7
roamSamp$val8
roamSamp$val9
roamSamp$val10
churnFeat1 <- cbind(churnFeat1,roamSamp$df1$SD)



colnames(churnFeat1) <- c('roam_ic_SD','roam_og_SD','loc_og_t2t_SD','loc_og_t2m_SD','loc_og_t2f_SD','loc_og_t2c_SD','loc_og_SD','std_og_t2t_SD','std_og_t2m_SD','std_og_t2f_SD','std_og_SD','isd_og_SD','spl_og_SD','og_others_SD','total_og_SD','loc_ic_t2t_SD','loc_ic_t2m_SD','loc_ic_t2f_SD','loc_ic_SD','std_ic_t2t_SD','std_ic_t2m_SD','std_ic_t2f_SD','std_ic_SD')

head(churnFeat1)

A parabolic relationship with the bottom end having the maximum propensity of churn

Total incoming calls

roamSamp <- scalerFun('total_ic_mou_6','total_ic_mou_7','total_ic_mou_8')
roamSamp$df1
roamSamp$val1
roamSamp$val2
roamSamp$val3
roamSamp$val4
roamSamp$val5
roamSamp$val6
roamSamp$val7
roamSamp$val8
roamSamp$val9
roamSamp$val10

churnFeat1 <- cbind(churnFeat1,roamSamp$df1$SD)

colnames(churnFeat1) <- c('roam_ic_SD','roam_og_SD','loc_og_t2t_SD','loc_og_t2m_SD','loc_og_t2f_SD','loc_og_t2c_SD','loc_og_SD','std_og_t2t_SD','std_og_t2m_SD','std_og_t2f_SD','std_og_SD','isd_og_SD','spl_og_SD','og_others_SD','total_og_SD','loc_ic_t2t_SD','loc_ic_t2m_SD','loc_ic_t2f_SD','loc_ic_SD','std_ic_t2t_SD','std_ic_t2m_SD','std_ic_t2f_SD','std_ic_SD','total_ic_SD')

head(churnFeat1)
NA

For total incoming the bottom 5000 has the heighest % of churn cases with almost 40%. This could be on the basis of the feature with 43% churn percentage

Special incoming


roamSamp <- scalerFun('spl_ic_mou_6','spl_ic_mou_7','spl_ic_mou_8')
roamSamp$df1
roamSamp$val1
roamSamp$val2
roamSamp$val3
roamSamp$val4
roamSamp$val5
roamSamp$val6
roamSamp$val7
roamSamp$val8
roamSamp$val9
roamSamp$val10

churnFeat1 <- cbind(churnFeat1,roamSamp$df1$SD)

colnames(churnFeat1) <- c('roam_ic_SD','roam_og_SD','loc_og_t2t_SD','loc_og_t2m_SD','loc_og_t2f_SD','loc_og_t2c_SD','loc_og_SD','std_og_t2t_SD','std_og_t2m_SD','std_og_t2f_SD','std_og_SD','isd_og_SD','spl_og_SD','og_others_SD','total_og_SD','loc_ic_t2t_SD','loc_ic_t2m_SD','loc_ic_t2f_SD','loc_ic_SD','std_ic_t2t_SD','std_ic_t2m_SD','std_ic_t2f_SD','std_ic_SD','total_ic_SD','spl_ic_SD')

head(churnFeat1)
NA
NA

Nothing interesting going on here with the special calls.

roamSamp <- scalerFun('isd_ic_mou_6','isd_ic_mou_7','isd_ic_mou_8')
roamSamp$df1
roamSamp$val1
roamSamp$val2
roamSamp$val3
roamSamp$val4
roamSamp$val5
roamSamp$val6
roamSamp$val7
roamSamp$val8
roamSamp$val9
roamSamp$val10

churnFeat1 <- cbind(churnFeat1,roamSamp$df1$SD)

colnames(churnFeat1) <- c('roam_ic_SD','roam_og_SD','loc_og_t2t_SD','loc_og_t2m_SD','loc_og_t2f_SD','loc_og_t2c_SD','loc_og_SD','std_og_t2t_SD','std_og_t2m_SD','std_og_t2f_SD','std_og_SD','isd_og_SD','spl_og_SD','og_others_SD','total_og_SD','loc_ic_t2t_SD','loc_ic_t2m_SD','loc_ic_t2f_SD','loc_ic_SD','std_ic_t2t_SD','std_ic_t2m_SD','std_ic_t2f_SD','std_ic_SD','total_ic_SD','spl_ic_SD','isd_ic_SD')

head(churnFeat1)
NA

Nothing interesting going on here too

Other incoming

roamSamp <- scalerFun('ic_others_6','ic_others_7','ic_others_8')
roamSamp$df1
roamSamp$val1
roamSamp$val2
roamSamp$val3
roamSamp$val4
roamSamp$val5
roamSamp$val6
roamSamp$val7
roamSamp$val8
roamSamp$val9
roamSamp$val10

churnFeat1 <- cbind(churnFeat1,roamSamp$df1$SD)

colnames(churnFeat1) <- c('roam_ic_SD','roam_og_SD','loc_og_t2t_SD','loc_og_t2m_SD','loc_og_t2f_SD','loc_og_t2c_SD','loc_og_SD','std_og_t2t_SD','std_og_t2m_SD','std_og_t2f_SD','std_og_SD','isd_og_SD','spl_og_SD','og_others_SD','total_og_SD','loc_ic_t2t_SD','loc_ic_t2m_SD','loc_ic_t2f_SD','loc_ic_SD','std_ic_t2t_SD','std_ic_t2m_SD','std_ic_t2f_SD','std_ic_SD','total_ic_SD','spl_ic_SD','isd_ic_SD','ic_others_SD')

head(churnFeat1)
NA

This is also not very promising feature

Total recharge numbers

roamSamp <- scalerFun('total_rech_num_6','total_rech_num_7','total_rech_num_8')
roamSamp$df1
roamSamp$val1
roamSamp$val2
roamSamp$val3
roamSamp$val4
roamSamp$val5
roamSamp$val6
roamSamp$val7
roamSamp$val8
roamSamp$val9
roamSamp$val10

churnFeat1 <- cbind(churnFeat1,roamSamp$df1$SD)

colnames(churnFeat1) <- c('roam_ic_SD','roam_og_SD','loc_og_t2t_SD','loc_og_t2m_SD','loc_og_t2f_SD','loc_og_t2c_SD','loc_og_SD','std_og_t2t_SD','std_og_t2m_SD','std_og_t2f_SD','std_og_SD','isd_og_SD','spl_og_SD','og_others_SD','total_og_SD','loc_ic_t2t_SD','loc_ic_t2m_SD','loc_ic_t2f_SD','loc_ic_SD','std_ic_t2t_SD','std_ic_t2m_SD','std_ic_t2f_SD','std_ic_SD','total_ic_SD','spl_ic_SD','isd_ic_SD','ic_others_SD','total_rech_num_SD')

head(churnFeat1)
NA

The higher SD values have larger proportion of churn cases 26% compared to the other cases.

Total recharge amount

roamSamp <- scalerFun('total_rech_amt_6','total_rech_amt_7','total_rech_amt_8')
roamSamp$df1
roamSamp$val1
roamSamp$val2
roamSamp$val3
roamSamp$val4
roamSamp$val5
roamSamp$val6
roamSamp$val7
roamSamp$val8
roamSamp$val9
roamSamp$val10
churnFeat1 <- cbind(churnFeat1,roamSamp$df1$SD)

colnames(churnFeat1) <- c('roam_ic_SD','roam_og_SD','loc_og_t2t_SD','loc_og_t2m_SD','loc_og_t2f_SD','loc_og_t2c_SD','loc_og_SD','std_og_t2t_SD','std_og_t2m_SD','std_og_t2f_SD','std_og_SD','isd_og_SD','spl_og_SD','og_others_SD','total_og_SD','loc_ic_t2t_SD','loc_ic_t2m_SD','loc_ic_t2f_SD','loc_ic_SD','std_ic_t2t_SD','std_ic_t2m_SD','std_ic_t2f_SD','std_ic_SD','total_ic_SD','spl_ic_SD','isd_ic_SD','ic_others_SD','total_rech_num_SD','total_rech_amt_SD')

head(churnFeat1)
NA

The recharge amount has similar trend as recharge numbers

maximum recharge amount

roamSamp <- scalerFun('max_rech_amt_6','max_rech_amt_7','max_rech_amt_8')
roamSamp$df1
roamSamp$val1
roamSamp$val2
roamSamp$val3
roamSamp$val4
roamSamp$val5
roamSamp$val6
roamSamp$val7
roamSamp$val8
roamSamp$val9
roamSamp$val10

churnFeat1 <- cbind(churnFeat1,roamSamp$df1$SD)

colnames(churnFeat1) <- c('roam_ic_SD','roam_og_SD','loc_og_t2t_SD','loc_og_t2m_SD','loc_og_t2f_SD','loc_og_t2c_SD','loc_og_SD','std_og_t2t_SD','std_og_t2m_SD','std_og_t2f_SD','std_og_SD','isd_og_SD','spl_og_SD','og_others_SD','total_og_SD','loc_ic_t2t_SD','loc_ic_t2m_SD','loc_ic_t2f_SD','loc_ic_SD','std_ic_t2t_SD','std_ic_t2m_SD','std_ic_t2f_SD','std_ic_SD','total_ic_SD','spl_ic_SD','isd_ic_SD','ic_others_SD','total_rech_num_SD','total_rech_amt_SD','max_rech_amt_SD')

head(churnFeat1)
NA

Not very pronounced trend here eventhough higher sd values band have higher percentage of churn cases.

last day recharge amount

roamSamp <- scalerFun('last_day_rch_amt_6','last_day_rch_amt_7','last_day_rch_amt_8')
roamSamp$df1
roamSamp$val1
roamSamp$val2
roamSamp$val3
roamSamp$val4
roamSamp$val5
roamSamp$val6
roamSamp$val7
roamSamp$val8
roamSamp$val9
roamSamp$val10

churnFeat1 <- cbind(churnFeat1,roamSamp$df1$SD)

colnames(churnFeat1) <- c('roam_ic_SD','roam_og_SD','loc_og_t2t_SD','loc_og_t2m_SD','loc_og_t2f_SD','loc_og_t2c_SD','loc_og_SD','std_og_t2t_SD','std_og_t2m_SD','std_og_t2f_SD','std_og_SD','isd_og_SD','spl_og_SD','og_others_SD','total_og_SD','loc_ic_t2t_SD','loc_ic_t2m_SD','loc_ic_t2f_SD','loc_ic_SD','std_ic_t2t_SD','std_ic_t2m_SD','std_ic_t2f_SD','std_ic_SD','total_ic_SD','spl_ic_SD','isd_ic_SD','ic_others_SD','total_rech_num_SD','total_rech_amt_SD','max_rech_amt_SD','last_day_rch_amt_SD')

head(churnFeat1)
NA

Not a very informative feature

Total recharge data

roamSamp <- scalerFun('total_rech_data_6','total_rech_data_7','total_rech_data_8')
roamSamp$df1
roamSamp$val1
roamSamp$val2
roamSamp$val3
roamSamp$val4
roamSamp$val5
roamSamp$val6
roamSamp$val7
roamSamp$val8
roamSamp$val9
roamSamp$val10

churnFeat1 <- cbind(churnFeat1,roamSamp$df1$SD)

colnames(churnFeat1) <- c('roam_ic_SD','roam_og_SD','loc_og_t2t_SD','loc_og_t2m_SD','loc_og_t2f_SD','loc_og_t2c_SD','loc_og_SD','std_og_t2t_SD','std_og_t2m_SD','std_og_t2f_SD','std_og_SD','isd_og_SD','spl_og_SD','og_others_SD','total_og_SD','loc_ic_t2t_SD','loc_ic_t2m_SD','loc_ic_t2f_SD','loc_ic_SD','std_ic_t2t_SD','std_ic_t2m_SD','std_ic_t2f_SD','std_ic_SD','total_ic_SD','spl_ic_SD','isd_ic_SD','ic_others_SD','total_rech_num_SD','total_rech_amt_SD','max_rech_amt_SD','last_day_rch_amt_SD','total_rech_data_SD')

head(churnFeat1)
NA
NA

Not much informative features

Maximum recharge for data

roamSamp <- scalerFun('max_rech_data_6','max_rech_data_7','max_rech_data_8')
roamSamp$df1
roamSamp$val1
roamSamp$val2
roamSamp$val3
roamSamp$val4
roamSamp$val5
roamSamp$val6
roamSamp$val7
roamSamp$val8
roamSamp$val9
roamSamp$val10

churnFeat1 <- cbind(churnFeat1,roamSamp$df1$SD)

colnames(churnFeat1) <- c('roam_ic_SD','roam_og_SD','loc_og_t2t_SD','loc_og_t2m_SD','loc_og_t2f_SD','loc_og_t2c_SD','loc_og_SD','std_og_t2t_SD','std_og_t2m_SD','std_og_t2f_SD','std_og_SD','isd_og_SD','spl_og_SD','og_others_SD','total_og_SD','loc_ic_t2t_SD','loc_ic_t2m_SD','loc_ic_t2f_SD','loc_ic_SD','std_ic_t2t_SD','std_ic_t2m_SD','std_ic_t2f_SD','std_ic_SD','total_ic_SD','spl_ic_SD','isd_ic_SD','ic_others_SD','total_rech_num_SD','total_rech_amt_SD','max_rech_amt_SD','last_day_rch_amt_SD','total_rech_data_SD','max_rech_data_SD')

head(churnFeat1)
NA
NA

This strategy of standard deviation not very informative for these features

Count of 2g /3g recharge

roamSamp <- scalerFun('jun_vbc_3g','jul_vbc_3g','aug_vbc_3g')
roamSamp$df1
roamSamp$val1
roamSamp$val2
roamSamp$val3
roamSamp$val4
roamSamp$val5
roamSamp$val6
roamSamp$val7
roamSamp$val8
roamSamp$val9
roamSamp$val10

churnFeat1 <- cbind(churnFeat1,roamSamp$df1$SD)

colnames(churnFeat1) <- c('roam_ic_SD','roam_og_SD','loc_og_t2t_SD','loc_og_t2m_SD','loc_og_t2f_SD','loc_og_t2c_SD','loc_og_SD','std_og_t2t_SD','std_og_t2m_SD','std_og_t2f_SD','std_og_SD','isd_og_SD','spl_og_SD','og_others_SD','total_og_SD','loc_ic_t2t_SD','loc_ic_t2m_SD','loc_ic_t2f_SD','loc_ic_SD','std_ic_t2t_SD','std_ic_t2m_SD','std_ic_t2f_SD','std_ic_SD','total_ic_SD','spl_ic_SD','isd_ic_SD','ic_others_SD','total_rech_num_SD','total_rech_amt_SD','max_rech_amt_SD','last_day_rch_amt_SD','total_rech_data_SD','max_rech_data_SD','aug_vbc_SD')

head(churnFeat1)
NA

count_rech_2g_6 : Not informative count_rech_3g_6 : Not informative av_rech_amt_data_6 vol_2g_mb_6 / 3g arpu_3g_8 / 2g night_pck_user_8

churnData[1:10,]

Using the new features to build a model

Let us spot check with different models

set.seed(123)

fit.glmnet <- train(churn~.,data = churnFeat1,method='glmnet',metric=metric,trControl=trainC)
1 package is needed for this model and is not installed. (glmnet). Would you like to try to install it now?
1: yes
2: no
unique(churnFeat1$churn)
[1] 1 0
Levels: 0 1
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpKTUpQRlUNCjI4LUZlYi0yMDIwDQpUaGlzIGlzIHRoZSBub3RlYm9vayBmb3IgZXhwbG9yYXRvcnkgZGF0YSBhbmFseXNpcyBmb3IgdGhlIEN1cm4gcHJvamVjdC4gTG9yZCBibGVzcyB0aGlzIGF0dGVtcHQgb2YgeW91cnMNCg0KIyBMZXQgdXMgbG9vayB0aGUgZmlyc3QgdXNlciByZWNvcmQNCmBgYHtyfQ0KIyBSZW5hbWluZyB0aGUgZGF0YSBmcmFtZQ0KYXNzaWduKCdjaHVybkRhdGEnICxgdGVsZWNvbV9jaHVybl9kYXRhLigxKWApDQpgYGANCg0KDQoNCmBgYHtyfQ0KY2h1cm5EYXRhWzE6MTAsXQ0KYGBgDQoNCg0KTGV0IHVzIGxvb2sgYXQgdGhlIGRpZmZlcmVudCBjb2x1bW5zIGFuZCBwaWNrIHNvbWUgb2YgdGhlbSBmb3IgdmVyaWZpY2F0aW9uDQoNCmBgYHtyfQ0KbmFtZXMoY2h1cm5EYXRhKQ0KYGBgDQoNCiMgRmluZCB0aGUgY29sdW1ucyB3aXRoIG51bGwgdmFsdWVzDQoNCmBgYHtyfQ0KbmFEYXRhID0gZGF0YS5mcmFtZShjb2xTdW1zKGlzLm5hKGNodXJuRGF0YSkpKQ0KbmFEYXRhJHBlcmNlbnRhZ2UgPSAobmFEYXRhJGNvbFN1bXMuaXMubmEuY2h1cm5EYXRhLi4vbnJvdyhjaHVybkRhdGEpKSoxMDANCmNvbG5hbWVzKG5hRGF0YSlbMV0gPSBjKCdOQXMnKQ0KbmFEYXRhDQoNCmBgYA0KDQojIERlcml2ZSBzdW1tYXJ5IHN0YXRpc3RpY3Mgb2YgdmFyaW91cyBjb2x1bW5zDQoNCmBgYHtyfQ0Kc3VtbWFyeShjaHVybkRhdGEpDQpgYGANCg0KTGV0IHVzIGZpbmQgc29tZSBjb2x1bW5zIHdoZXJlIHRoZSBjb2x1bW4gc3VtcyBhcmUgemVyby4gVGhlc2UgY29sdW1ucyBoYXZlIHRvIGJlIGVsaW1pbmF0ZWQuIFRvIGRvIHRoYXQgbGV0IHVzIGZpbmQgdGhvc2UgbnVtZXJpYyBjb2x1bW5zDQoNCmBgYHtyfQ0KbGlicmFyeShkcGx5cikNCm51bUNvbHMgPSBjaHVybkRhdGEgJT4lIHNlbGVjdF9pZihpcy5udW1lcmljKSAlPiUgY29sbmFtZXMoKQ0KDQpudW1DaHVybiA9IGNodXJuRGF0YVssbnVtQ29sc10NCmhlYWQobnVtQ2h1cm4pDQpgYGANCg0KTm93IGxldCB1cyBmaW5kIHRob3NlIGNvbHVtbnMgd2hvc2Ugc3VtcyBlcXVhbCAwIGFuZCB0aGVuIGZpbmQgdGhvc2UgY29sdW1uIG5hbWVzDQoNCmBgYHtyfQ0KI3plcm9Db2xzID0gbnVtQ2h1cm4gJT4lIGNvbFN1bXMobmEucm0gPSBUUlVFKSAlPiUgZGF0YS5mcmFtZSgpICU+JSBjb2xuYW1lcygnc3VtJykNCiN6ZXJvQ29scw0KDQp6ZXJvQ29scyA9IGNvbG5hbWVzKG51bUNodXJuW2NvbFN1bXMobnVtQ2h1cm4sbmEucm0gPSBUUlVFKSA9PSAwXSkNCg0Kc3VtbWFyeShudW1DaHVyblssemVyb0NvbHNdKQ0KYGBgDQoNCkxldHMgZWxpbWluYXRlIHRoZXNlIGNvbHVtbnMgZnJvbSB0aGUgZGF0YSBzZXQNCg0KYGBge3J9DQpkaW0obnVtQ2h1cm4pDQojIFJlbW92aW5nIHRoZSB6ZXJvIHN1bSBjb2x1bW5zDQpudW1DaHVybiA8LSBudW1DaHVybiAlPiUgc2VsZWN0KC1jKHplcm9Db2xzKSkNCg0KZGltKG51bUNodXJuKQ0KDQpgYGANCmBgYHtyfQ0KaGVhZChudW1DaHVybikNCnN1bW1hcnkobnVtQ2h1cm4pDQpgYGANCg0KTGV0IHVzIGxvb2sgYXQgZHVwbGljYXRlcyBpbiB0aGUgbW9iaWxlIG51bWJlciBjb2x1bW4gDQoNCmBgYHtyfQ0KbGVuZ3RoKHVuaXF1ZShudW1DaHVybiRjaXJjbGVfaWQpKQ0KYGBgDQoNCg0KTGV0IHVzIG5vdyBjcmVhdGUgdGhlIHRhcmdldCB2YXJpYWJsZSB3aGljaCBpcyB0aGUgaW5kaWNhdG9yIGZvciBjaHVybi4NCg0KYGBge3J9DQojIENvbnNvbGlkYXRpbmcgdGhlIGNhbGxzIGRhdGEgZm9yIHNlcHQgbW9udGgNCm51bUNodXJuJFNlcENhbGxzIDwtIG51bUNodXJuJHRvdGFsX2ljX21vdV85ICsgbnVtQ2h1cm4kdG90YWxfb2dfbW91XzkNCg0KaGVhZChudW1DaHVybixuPTEwKQ0KYGBgDQoNCmBgYHtyfQ0KIyBDb25zb2xpZGF0aW5nIHRoZSBpbnRlcm5ldCBkYXRhIGZvciBTZXB0IG1vbnRoDQpudW1DaHVybiRTZXBJbnRlcm5ldCA8LSBudW1DaHVybiR2b2xfMmdfbWJfOSArIG51bUNodXJuJHZvbF8zZ19tYl85DQoNCmBgYA0KDQpUaGUgY3VzdG9tZXJzIHdobyBoYXZlIG5vIGNhbGwgYW5kIGludGVybmV0IGRhdGEgaW4gdGhlIFNlcHQgbW9udGggd291bGQgYmUgdGhlIG9uZXMgd2hvIGhhdmUgY2h1cm5lZA0KDQpgYGB7cn0NCiMgRmlyc3QgaW5pdGlhbGlzZSBhbGwgcmVjb3JkcyB0byAwDQpudW1DaHVybiR0YXJnZXQgPC0gMA0KDQojIFRob3NlIHJvd3Mgd2hlcmUgdGhlIGNhbGxzIGFuZCBpbnRlcm5ldCBhcmUgemVybyBpcyB0aGUgY2h1cm4gZGF0YQ0KDQpudW1DaHVybltudW1DaHVybiRTZXBDYWxscyA9PSAwICYgbnVtQ2h1cm4kU2VwSW50ZXJuZXQgPT0gMCwndGFyZ2V0J10gPC0gMQ0KDQpudW1DaHVyblswOjUwLDIwMzoyMDZdDQpgYGANCg0KIyMjIFRha2luZyBzb21lIHZhcmlhYmxlcyBhbmQgdmlzdWFsaXppbmcgc29tZSB0cmVuZHMgd2l0aCByZXNwZWN0IHRvIENodXJuDQoNClByb3Bvc2l0aW9uIDEgOiBMZXQgdXMgdGFrZSB0aGUgcmV2ZW51ZSBwZXIgbW9udGggZm9yIHRocmVlIG1vbnRocyBhbmQgdGFrZSBpdHMgc3RhbmRhcmQgZGV2aWF0aW9uIGFuZCB0aGVuIHNlZSBpZiB0aGVyZSBhcmUgYW55IHRyZW5kcyBjb21pbmcgdXANCg0KYGBge3J9DQojIHRha2UgYSBzYW1wbGUgb2Ygb25seSB0aGUgcmVxdWlyZWQgdmFyaWFibGVzDQpjaHVyblNhbXAxIDwtIG51bUNodXJuICU+JSBzZWxlY3QobW9iaWxlX251bWJlcixhcnB1XzYsYXJwdV83LGFycHVfOCx0YXJnZXQpDQoNCiMgbGV0IHVzIGNyZWF0ZSBhIG5ldyBzYW1wbGUgdG8gdGFrZSBvbmx5IHRoZSBBUlB1IGZpZ3VyZXMgdG8gdGFrZSByb3cgd2lzZSBzdGFuZGFyZCBkZXZpYXRpb24NCg0KY2h1cm5TYW1wMiA8LSBjaHVyblNhbXAxICU+JSBzZWxlY3QoYXJwdV82LGFycHVfNyxhcnB1XzgpDQoNCiMgU2NhbGluZyB0aGUgZGF0YQ0KDQpsaWJyYXJ5KGNhcmV0KQ0KDQpwcCA9IHByZVByb2Nlc3MoY2h1cm5TYW1wMixtZXRob2QgPSAnc2NhbGUnKQ0KY2h1cm5TYW1wMl90cmFuID0gcHJlZGljdChwcCxjaHVyblNhbXAyKQ0KDQoNCg0KYGBgDQoNCmBgYHtyfQ0KY2h1cm5TYW1wMl90cmFuIDwtIHRyYW5zZm9ybShjaHVyblNhbXAyX3RyYW4sU0QgPSBhcHBseShjaHVyblNhbXAyX3RyYW4sMSxzZCxuYS5ybSA9IFRSVUUpKQ0KDQpjaHVyblNhbXAyX3RyYW4NCg0KYGBgDQoNCkxldCB1cyBhZGQgdGhlIG1vYmlsZSBudW1iZXJzIHRvIHRoZSBkYXRhIHNldCBhbmQgZG8gc29tZSB2aXN1YWxpDQoNCg0KYGBge3J9DQpjaHVyblNhbXAyX3RyYW4kbW9iaWxlIDwtIGNodXJuRGF0YSRtb2JpbGVfbnVtYmVyDQpjaHVyblNhbXAyX3RyYW4kdGFyZ2V0IDwtIG51bUNodXJuJHRhcmdldA0KaGVhZChjaHVyblNhbXAyX3RyYW4pDQpgYGANCg0KDQpMZXQgdXMgcGxvdCB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSByZXZlbnVlIGFuZCBmaW5kIHNvbWUgYmlucw0KDQoNCg0KDQoNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KDQpjaHVyblNhbXAyX3RyYW4gJT4lIGdncGxvdChhZXMobW9iaWxlLFNEKSkgKyBnZW9tX3BvaW50KCkNCg0KYGBgDQoNCiMgVGhlIG5leHQgdGFzayBpcyB0byBmaW5kIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiByZXZlbnVlIGFuZCB0aGUgcG9zc2liaWxpdHkgb2YgY2h1cm4uIA0KDQpIeXBvdGhlc2lzIDEuIA0KVG9vIG11Y2ggZmx1eCBpbiB0aGUgcmV2ZW51ZSBjYW4gaW5kaWNhdGUgcHJvcGVuc2l0eSB0byBjaHVybg0KDQpMZXQgdXMgbG9vayBhdCBjYXNlcyB3aGVyZSB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIGlzIGFib3ZlIDUNCg0KYGBge3J9DQpjaHVyblNhbXAyX3RyYW4gJT4lIGZpbHRlcihTRCA+IDUpICU+JSBtdXRhdGUoUGVyID0gc3VtKHRhcmdldCkvbigpKSAlPiUgc2VsZWN0KFBlcikgJT4lIHN1bW1hcmlzZShNbiA9IG1lYW4oUGVyLG5hLnJtID0gVFJVRSkpDQoNCg0KDQpgYGANClRoZSBudW1iZXIgb2YgY3VzdG9tZXJzIHdobyBhcmUgbGlrZWx5IHRvIGNodXJuIGluIHRoZSBoaWdoIHNkIHJhbmdlIGlzIGFsbW9zdCAzIHRpbWVzIHRoZSBub3JtYWwgem9uZQ0KDQpMZXQgdXMgbm93IGxvb2sgYXQgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc0QNCg0KDQpgYGB7cn0NCmNodXJuU2FtcDJfdHJhbiAlPiUgZ2dwbG90KGFlcyh4PSBTRCkpICsgZ2VvbV9kZW5zaXR5KCkNCg0KIyBNYXBwaW5nIHRoZSBxdWFudGlsZSB2YWx1ZXMgYWxzbw0KcXVhbnRpbGUoY2h1cm5TYW1wMl90cmFuJFNELCBjKC4wNSwgLjE1LC4yNSwuNSwuNiwuNzUsLjg1LCAuOTgpKQ0KDQpgYGANCkxldCB1cyBwbG90IHNvbWUgdGFibGVzIGJhc2VkIG9uIHRoZXNlIGJpbnMgYW5kIHNlZSB0aGUgJSBvZiBjdXN0b21lcnMgd2l0aGluIHRoZXNlIGJpbnMNCg0KYGBge3J9DQpjaHVyblNhbXAyX3RyYW4gJT4lIGZpbHRlcihTRCA8IDAuMDU3MDkzMjggKSAlPiUgbXV0YXRlKFBlciA9IHN1bSh0YXJnZXQpL24oKSkgJT4lIHNlbGVjdChQZXIpICU+JSBzdW1tYXJpc2UoTlVtID0gbigpLE1uID0gbWVhbihQZXIsbmEucm0gPSBUUlVFKSkNCg0KY2h1cm5TYW1wMl90cmFuICU+JSBmaWx0ZXIoU0QgPj0gMC4wNTcwOTMyOCAmIFNEIDwgMC4xMDA0MTk0OSAgKSAlPiUgbXV0YXRlKFBlciA9IHN1bSh0YXJnZXQpL24oKSkgJT4lIHNlbGVjdChQZXIpICU+JSBzdW1tYXJpc2UoTlVtID0gbigpLE1uID0gbWVhbihQZXIsbmEucm0gPSBUUlVFKSkNCg0KY2h1cm5TYW1wMl90cmFuICU+JSBmaWx0ZXIoU0QgPj0gMC4xMDA0MTk0OSAmIFNEIDwgMC4xMzg3ODU2NyAgICkgJT4lIG11dGF0ZShQZXIgPSBzdW0odGFyZ2V0KS9uKCkpICU+JSBzZWxlY3QoUGVyKSAlPiUgc3VtbWFyaXNlKE5VbSA9IG4oKSxNbiA9IG1lYW4oUGVyLG5hLnJtID0gVFJVRSkpDQoNCmNodXJuU2FtcDJfdHJhbiAlPiUgZmlsdGVyKFNEID49IDAuMTM4Nzg1NjcgICYgU0QgPCAwLjI1MTU1OTc1ICAgKSAlPiUgbXV0YXRlKFBlciA9IHN1bSh0YXJnZXQpL24oKSkgJT4lIHNlbGVjdChQZXIpICU+JSBzdW1tYXJpc2UoTlVtID0gbigpLE1uID0gbWVhbihQZXIsbmEucm0gPSBUUlVFKSkNCg0KY2h1cm5TYW1wMl90cmFuICU+JSBmaWx0ZXIoU0QgPj0gMC4yNTE1NTk3NSAgJiBTRCA8IDAuMzEzMTg5ODYgICApICU+JSBtdXRhdGUoUGVyID0gc3VtKHRhcmdldCkvbigpKSAlPiUgc2VsZWN0KFBlcikgJT4lIHN1bW1hcmlzZShOVW0gPSBuKCksTW4gPSBtZWFuKFBlcixuYS5ybSA9IFRSVUUpKQ0KDQpjaHVyblNhbXAyX3RyYW4gJT4lIGZpbHRlcihTRCA+PSAwLjMxMzE4OTg2ICAmIFNEIDwgMC40NDgwNzgxNyAgICkgJT4lIG11dGF0ZShQZXIgPSBzdW0odGFyZ2V0KS9uKCkpICU+JSBzZWxlY3QoUGVyKSAlPiUgc3VtbWFyaXNlKE5VbSA9IG4oKSxNbiA9IG1lYW4oUGVyLG5hLnJtID0gVFJVRSkpDQoNCmNodXJuU2FtcDJfdHJhbiAlPiUgZmlsdGVyKFNEID49IDAuNDQ4MDc4MTcgICYgU0QgPCAwLjYxMjMwMTkyICAgKSAlPiUgbXV0YXRlKFBlciA9IHN1bSh0YXJnZXQpL24oKSkgJT4lIHNlbGVjdChQZXIpICU+JSBzdW1tYXJpc2UoTlVtID0gbigpLE1uID0gbWVhbihQZXIsbmEucm0gPSBUUlVFKSkNCg0KY2h1cm5TYW1wMl90cmFuICU+JSBmaWx0ZXIoU0QgPj0gMC42MTIzMDE5MiAgJiBTRCA8IDEuNDM5OTcxNjggICAgKSAlPiUgbXV0YXRlKFBlciA9IHN1bSh0YXJnZXQpL24oKSkgJT4lIHNlbGVjdChQZXIpICU+JSBzdW1tYXJpc2UoTlVtID0gbigpLE1uID0gbWVhbihQZXIsbmEucm0gPSBUUlVFKSkNCg0KY2h1cm5TYW1wMl90cmFuICU+JSBmaWx0ZXIoU0QgPj0gMS40Mzk5NzE2OCkgJT4lIG11dGF0ZShQZXIgPSBzdW0odGFyZ2V0KS9uKCkpICU+JSBzZWxlY3QoUGVyKSAlPiUgc3VtbWFyaXNlKE1uID0gbWVhbihQZXIsbmEucm0gPSBUUlVFKSxOVW0gPSBuKCkpDQoNCmBgYA0KDQojIEZlYXR1cmUgRW5naW5lZXJpbmcgMSA6IA0KDQpDcmVhdGluZyB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBhcnB1IGFjY3Jvc3MgbW9udGhzIDYgdG8gOCBzZWVtcyB0byBiZSBhIGdvb2QgaW5kaWNhdG9yDQoNCmBgYHtyfQ0KaGVhZChudW1DaHVybikNCmBgYA0KDQojIyBIeXBvdGhlc2lzIDI6DQoNCkxldCB1cyBsb29rIGF0IHRoZSBvbiBuZXR3b3JrIG1vdS4gTXkgaHlwb3RoZXNpcyBpcyB0aGVyZSBzaG91bGRudCBiZSBhbnkgY2hhbmdlIGluIHRoZSBvbiBuZXR3b3JrIG1vdSBhcyB0byB3aGV0aGVyIGEgY3VzdG9tZXIgaXMgY2h1cm5pbmcgb3Igbm90DQoNCmBgYHtyfQ0KIyB0YWtlIGEgc2FtcGxlIG9mIG9ubHkgdGhlIHJlcXVpcmVkIHZhcmlhYmxlcw0KY2h1cm5TYW1wMV9oeXAyIDwtIG51bUNodXJuICU+JSBzZWxlY3QobW9iaWxlX251bWJlcixvZmZuZXRfbW91XzYsb2ZmbmV0X21vdV83LG9mZm5ldF9tb3VfOCx0YXJnZXQpDQoNCiMgbGV0IHVzIGNyZWF0ZSBhIG5ldyBzYW1wbGUgdG8gdGFrZSBvbmx5IHRoZSBBUlB1IGZpZ3VyZXMgdG8gdGFrZSByb3cgd2lzZSBzdGFuZGFyZCBkZXZpYXRpb24NCg0KY2h1cm5TYW1wMl9oeXAyIDwtIGNodXJuU2FtcDFfaHlwMiAlPiUgc2VsZWN0KG9mZm5ldF9tb3VfNixvZmZuZXRfbW91Xzcsb2ZmbmV0X21vdV84KQ0KDQpjaHVyblNhbXAyX2h5cDJbaXMubmEoY2h1cm5TYW1wMl9oeXAyKV0gPC0gMA0KDQojIFNjYWxpbmcgdGhlIGRhdGENCg0KbGlicmFyeShjYXJldCkNCg0KcHAgPSBwcmVQcm9jZXNzKGNodXJuU2FtcDJfaHlwMixtZXRob2QgPSAnc2NhbGUnKQ0KY2h1cm5TYW1wMl9oeXAyID0gcHJlZGljdChwcCxjaHVyblNhbXAyX2h5cDIpDQpjaHVyblNhbXAyX2h5cDINCg0KYGBgDQoNCmBgYHtyfQ0KY2h1cm5TYW1wMl9oeXAyIDwtIHRyYW5zZm9ybShjaHVyblNhbXAyX2h5cDIsU0QgPSBhcHBseShjaHVyblNhbXAyX2h5cDIsMSxzZCxuYS5ybSA9IFRSVUUpKQ0KDQpjaHVyblNhbXAyX2h5cDIkbW9iaWxlIDwtIGNodXJuRGF0YSRtb2JpbGVfbnVtYmVyDQpjaHVyblNhbXAyX2h5cDIkdGFyZ2V0IDwtIG51bUNodXJuJHRhcmdldA0KaGVhZChjaHVyblNhbXAyX2h5cDIpDQpgYGANCg0KYGBge3J9DQojIE1hcHBpbmcgdGhlIHF1YW50aWxlIHZhbHVlcyBhbHNvDQpxdWFudGlsZShjaHVyblNhbXAyX2h5cDIkU0QsIGMoLjA1LCAuMTUsLjI1LC41LC42LC43NSwuODUsIC45NSwuOTkpKQ0KYGBgDQoNCmBgYHtyfQ0KY2h1cm5TYW1wMl9oeXAyICU+JSBmaWx0ZXIoU0QgPCAwLjAwMDc4OTcxNzggICkgJT4lIG11dGF0ZShQZXIgPSBzdW0odGFyZ2V0KS9uKCkpICU+JSBzZWxlY3QoUGVyKSAlPiUgc3VtbWFyaXNlKE5VbSA9IG4oKSxNbiA9IG1lYW4oUGVyLG5hLnJtID0gVFJVRSkpDQoNCmNodXJuU2FtcDJfaHlwMiAlPiUgZmlsdGVyKFNEID49IDAuMDAwNzg5NzE3OCAgJiBTRCA8IDAuMDA5OTQzMDAzOCAgICkgJT4lIG11dGF0ZShQZXIgPSBzdW0odGFyZ2V0KS9uKCkpICU+JSBzZWxlY3QoUGVyKSAlPiUgc3VtbWFyaXNlKE5VbSA9IG4oKSxNbiA9IG1lYW4oUGVyLG5hLnJtID0gVFJVRSkpDQoNCmNodXJuU2FtcDJfaHlwMiAlPiUgZmlsdGVyKFNEID49IDAuMDA5OTQzMDAzOCAgJiBTRCA8IDAuMDIwNzIyNjQ5OSAgICApICU+JSBtdXRhdGUoUGVyID0gc3VtKHRhcmdldCkvbigpKSAlPiUgc2VsZWN0KFBlcikgJT4lIHN1bW1hcmlzZShOVW0gPSBuKCksTW4gPSBtZWFuKFBlcixuYS5ybSA9IFRSVUUpKQ0KDQpjaHVyblNhbXAyX2h5cDIgJT4lIGZpbHRlcihTRCA+PSAwLjAyMDcyMjY0OTkgICAmIFNEIDwgMC4wNjQxNDY5NjU2ICAgICkgJT4lIG11dGF0ZShQZXIgPSBzdW0odGFyZ2V0KS9uKCkpICU+JSBzZWxlY3QoUGVyKSAlPiUgc3VtbWFyaXNlKE5VbSA9IG4oKSxNbiA9IG1lYW4oUGVyLG5hLnJtID0gVFJVRSkpDQoNCmNodXJuU2FtcDJfaHlwMiAlPiUgZmlsdGVyKFNEID49IDAuMDY0MTQ2OTY1NiAmIFNEIDwgMC4wOTY2MjA5NTE1ICAgICkgJT4lIG11dGF0ZShQZXIgPSBzdW0odGFyZ2V0KS9uKCkpICU+JSBzZWxlY3QoUGVyKSAlPiUgc3VtbWFyaXNlKE5VbSA9IG4oKSxNbiA9IG1lYW4oUGVyLG5hLnJtID0gVFJVRSkpDQoNCmNodXJuU2FtcDJfaHlwMiAlPiUgZmlsdGVyKFNEID49IDAuMDk2NjIwOTUxNSAgICYgU0QgPCAwLjE5NTkxMTU1MTIgICAgKSAlPiUgbXV0YXRlKFBlciA9IHN1bSh0YXJnZXQpL24oKSkgJT4lIHNlbGVjdChQZXIpICU+JSBzdW1tYXJpc2UoTlVtID0gbigpLE1uID0gbWVhbihQZXIsbmEucm0gPSBUUlVFKSkNCg0KY2h1cm5TYW1wMl9oeXAyICU+JSBmaWx0ZXIoU0QgPj0gMC4xOTU5MTE1NTEyICAgJiBTRCA8IDAuMzY5Njk2MDQ1MyAgICApICU+JSBtdXRhdGUoUGVyID0gc3VtKHRhcmdldCkvbigpKSAlPiUgc2VsZWN0KFBlcikgJT4lIHN1bW1hcmlzZShOVW0gPSBuKCksTW4gPSBtZWFuKFBlcixuYS5ybSA9IFRSVUUpKQ0KDQpjaHVyblNhbXAyX2h5cDIgJT4lIGZpbHRlcihTRCA+PSAwLjM2OTY5NjA0NTMgICAmIFNEIDwgMS4wMDE0ODgzMTgzICAgICApICU+JSBtdXRhdGUoUGVyID0gc3VtKHRhcmdldCkvbigpKSAlPiUgc2VsZWN0KFBlcikgJT4lIHN1bW1hcmlzZShOVW0gPSBuKCksTW4gPSBtZWFuKFBlcixuYS5ybSA9IFRSVUUpKQ0KDQpjaHVyblNhbXAyX2h5cDIgJT4lIGZpbHRlcihTRCA+PSAxLjAwMTQ4ODMxODMgICAmIFNEIDwgMi4zODE5MDM3ODQ2ICAgICAgKSAlPiUgbXV0YXRlKFBlciA9IHN1bSh0YXJnZXQpL24oKSkgJT4lIHNlbGVjdChQZXIpICU+JSBzdW1tYXJpc2UoTlVtID0gbigpLE1uID0gbWVhbihQZXIsbmEucm0gPSBUUlVFKSkNCg0KY2h1cm5TYW1wMl9oeXAyICU+JSBmaWx0ZXIoU0QgPj0gMi4zODE5MDM3ODQ2ICkgJT4lIG11dGF0ZShQZXIgPSBzdW0odGFyZ2V0KS9uKCkpICU+JSBzZWxlY3QoUGVyKSAlPiUgc3VtbWFyaXNlKE1uID0gbWVhbihQZXIsbmEucm0gPSBUUlVFKSxOVW0gPSBuKCkpDQpgYGANCg0KVGhlIGJlaGF2aW91ciB3aXRoIHJlc3BlY3QgdG8gbmV0d29yayB1c2FnZSBpcyBmb3VuZCB0byBiZSBvcHBvc2l0ZSBvZiB0aGUgYmVoYXZpb3VyIHdoaWNoIHdhcyBmb3VuZCBmb3IgYXZlcmFnZSByZXZlbnVlLg0KDQpCb3RoIHRoZSBvbm5ldCBhbmQgb2ZmbmV0IHVzYWdlIGJlaGF2aW91ciBoYXMgYSBwYXJhYm9saWMgcmVsYXRpb25zaGlwIHdpdGggY2h1cm4uDQoNCiMjIyBMZXQgdXMgbG9vayBmb3Igb3RoZXIgcmVsYXRpb25zaGlwcw0KDQpgYGB7cn0NCmNodXJuRGF0YVsxOjEwLF0NCmBgYA0KDQpMZXQgdSBzbG9vayBhdCByb2FtaW5nIGluY29taW5nIGFuZCByb2FtaW5nIG91dGdvaW5nIHJlbGF0aW9uc2hpcHMNCg0KQ3JlYXRpbmcgYSBmdW5jdGlvbiB0byBkbyB0aGUgam9iDQpgYGB7cn0NCg0KDQoNCnNjYWxlckZ1biA8LSBmdW5jdGlvbih2YXIxLHZhcjIsdmFyMyl7DQogIA0KICMgdGFrZSBhIHNhbXBsZSBvZiBvbmx5IHRoZSByZXF1aXJlZCB2YXJpYWJsZXMNCmNodXJuU2FtcDFfaHlwMiA8LSBudW1DaHVybiAlPiUgc2VsZWN0KG1vYmlsZV9udW1iZXIsdmFyMSx2YXIyLHZhcjMpDQoNCiMgbGV0IHVzIGNyZWF0ZSBhIG5ldyBzYW1wbGUgdG8gdGFrZSBvbmx5IHRoZSBBUlB1IGZpZ3VyZXMgdG8gdGFrZSByb3cgd2lzZSBzdGFuZGFyZCBkZXZpYXRpb24NCg0KY2h1cm5TYW1wMl9oeXAyIDwtIGNodXJuU2FtcDFfaHlwMiAlPiUgc2VsZWN0KHZhcjEsdmFyMix2YXIzKQ0KDQpjaHVyblNhbXAyX2h5cDJbaXMubmEoY2h1cm5TYW1wMl9oeXAyKV0gPC0gMA0KDQojIFNjYWxpbmcgdGhlIGRhdGENCg0KcHAgPSBwcmVQcm9jZXNzKGNodXJuU2FtcDJfaHlwMixtZXRob2QgPSAnc2NhbGUnKQ0KY2h1cm5TYW1wMl9oeXAyID0gcHJlZGljdChwcCxjaHVyblNhbXAyX2h5cDIpDQoNCmNodXJuU2FtcDJfaHlwMiA8LSB0cmFuc2Zvcm0oY2h1cm5TYW1wMl9oeXAyLFNEID0gYXBwbHkoY2h1cm5TYW1wMl9oeXAyLDEsc2QsbmEucm0gPSBUUlVFKSkNCg0KY2h1cm5TYW1wMl9oeXAyJG1vYmlsZSA8LSBjaHVybkRhdGEkbW9iaWxlX251bWJlcg0KY2h1cm5TYW1wMl9oeXAyJHRhcmdldCA8LSBudW1DaHVybiR0YXJnZXQNCmNodXJuU2FtcDJfaHlwMg0KDQoNCiMgUXVhbnRpbGUgbWFwcGluZw0KDQpxdWFudHZhbHMgPC0gcXVhbnRpbGUoY2h1cm5TYW1wMl9oeXAyJFNELCBjKC4wNSwgLjE1LC4yNSwuNSwuNiwuNzUsLjg1LCAuOTUsLjk5KSxuYS5ybSA9IFRSVUUpDQoNCnZhbDEgPC0gY2h1cm5TYW1wMl9oeXAyICU+JSBmaWx0ZXIoU0QgPCBxdWFudHZhbHNbMV0gICkgJT4lIG11dGF0ZShQZXIgPSBzdW0odGFyZ2V0KS9uKCkpICU+JSBzZWxlY3QoUGVyKSAlPiUgc3VtbWFyaXNlKE5VbSA9IG4oKSxNbiA9IG1lYW4oUGVyLG5hLnJtID0gVFJVRSkpDQoNCnZhbDIgPC1jaHVyblNhbXAyX2h5cDIgJT4lIGZpbHRlcihTRCA+PSBxdWFudHZhbHNbMV0gICYgU0QgPCBxdWFudHZhbHNbMl0gICApICU+JSBtdXRhdGUoUGVyID0gc3VtKHRhcmdldCkvbigpKSAlPiUgc2VsZWN0KFBlcikgJT4lIHN1bW1hcmlzZShOVW0gPSBuKCksTW4gPSBtZWFuKFBlcixuYS5ybSA9IFRSVUUpKQ0KDQp2YWwzIDwtIGNodXJuU2FtcDJfaHlwMiAlPiUgZmlsdGVyKFNEID49IHF1YW50dmFsc1syXSAgJiBTRCA8IHF1YW50dmFsc1szXSAgICkgJT4lIG11dGF0ZShQZXIgPSBzdW0odGFyZ2V0KS9uKCkpICU+JSBzZWxlY3QoUGVyKSAlPiUgc3VtbWFyaXNlKE5VbSA9IG4oKSxNbiA9IG1lYW4oUGVyLG5hLnJtID0gVFJVRSkpDQoNCnZhbDQgPC1jaHVyblNhbXAyX2h5cDIgJT4lIGZpbHRlcihTRCA+PSBxdWFudHZhbHNbM10gICAmIFNEIDwgcXVhbnR2YWxzWzRdICAgKSAlPiUgbXV0YXRlKFBlciA9IHN1bSh0YXJnZXQpL24oKSkgJT4lIHNlbGVjdChQZXIpICU+JSBzdW1tYXJpc2UoTlVtID0gbigpLE1uID0gbWVhbihQZXIsbmEucm0gPSBUUlVFKSkNCg0KdmFsNSA8LWNodXJuU2FtcDJfaHlwMiAlPiUgZmlsdGVyKFNEID49IHF1YW50dmFsc1s0XSAmIFNEIDwgcXVhbnR2YWxzWzVdICAgICkgJT4lIG11dGF0ZShQZXIgPSBzdW0odGFyZ2V0KS9uKCkpICU+JSBzZWxlY3QoUGVyKSAlPiUgc3VtbWFyaXNlKE5VbSA9IG4oKSxNbiA9IG1lYW4oUGVyLG5hLnJtID0gVFJVRSkpDQoNCnZhbDYgPC1jaHVyblNhbXAyX2h5cDIgJT4lIGZpbHRlcihTRCA+PSBxdWFudHZhbHNbNV0gICAmIFNEIDwgcXVhbnR2YWxzWzZdICAgICkgJT4lIG11dGF0ZShQZXIgPSBzdW0odGFyZ2V0KS9uKCkpICU+JSBzZWxlY3QoUGVyKSAlPiUgc3VtbWFyaXNlKE5VbSA9IG4oKSxNbiA9IG1lYW4oUGVyLG5hLnJtID0gVFJVRSkpDQoNCnZhbDcgPC1jaHVyblNhbXAyX2h5cDIgJT4lIGZpbHRlcihTRCA+PSBxdWFudHZhbHNbNl0gICAmIFNEIDwgcXVhbnR2YWxzWzddICAgICkgJT4lIG11dGF0ZShQZXIgPSBzdW0odGFyZ2V0KS9uKCkpICU+JSBzZWxlY3QoUGVyKSAlPiUgc3VtbWFyaXNlKE5VbSA9IG4oKSxNbiA9IG1lYW4oUGVyLG5hLnJtID0gVFJVRSkpDQoNCnZhbDggPC1jaHVyblNhbXAyX2h5cDIgJT4lIGZpbHRlcihTRCA+PSBxdWFudHZhbHNbN10gICAmIFNEIDwgcXVhbnR2YWxzWzhdICAgICkgJT4lIG11dGF0ZShQZXIgPSBzdW0odGFyZ2V0KS9uKCkpICU+JSBzZWxlY3QoUGVyKSAlPiUgc3VtbWFyaXNlKE5VbSA9IG4oKSxNbiA9IG1lYW4oUGVyLG5hLnJtID0gVFJVRSkpDQoNCnZhbDkgPC1jaHVyblNhbXAyX2h5cDIgJT4lIGZpbHRlcihTRCA+PSBxdWFudHZhbHNbOF0gICAmIFNEIDwgcXVhbnR2YWxzWzldICAgICAgKSAlPiUgbXV0YXRlKFBlciA9IHN1bSh0YXJnZXQpL24oKSkgJT4lIHNlbGVjdChQZXIpICU+JSBzdW1tYXJpc2UoTlVtID0gbigpLE1uID0gbWVhbihQZXIsbmEucm0gPSBUUlVFKSkNCg0KdmFsMTAgPC1jaHVyblNhbXAyX2h5cDIgJT4lIGZpbHRlcihTRCA+PSBxdWFudHZhbHNbOV0gKSAlPiUgbXV0YXRlKFBlciA9IHN1bSh0YXJnZXQpL24oKSkgJT4lIHNlbGVjdChQZXIpICU+JSBzdW1tYXJpc2UoTlVtID0gbigpLE1uID0gbWVhbihQZXIsbmEucm0gPSBUUlVFKSkNCg0KbDEgPSBsaXN0KGRmMT1jaHVyblNhbXAyX2h5cDIsdmFsMT12YWwxLHZhbDI9dmFsMix2YWwzPXZhbDMsdmFsND12YWw0LHZhbDU9dmFsNSx2YWw2PXZhbDYsdmFsNz12YWw3LHZhbDg9dmFsOCx2YWw5PXZhbDksdmFsMTA9dmFsMTApDQoNCmwxICANCg0KfQ0KDQoNCmBgYA0KDQpSdW5uaW5nIHRoZSBmdW5jdGlvbiBmb3Igcm9hbWluZyB2YWx1ZXMNCg0KYGBge3J9DQpyb2FtU2FtcCA8LSBzY2FsZXJGdW4oJ3JvYW1faWNfbW91XzYnLCdyb2FtX2ljX21vdV83Jywncm9hbV9pY19tb3VfOCcpDQpyb2FtU2FtcCRkZjENCnJvYW1TYW1wJHZhbDENCnJvYW1TYW1wJHZhbDINCnJvYW1TYW1wJHZhbDMNCnJvYW1TYW1wJHZhbDQNCnJvYW1TYW1wJHZhbDUNCnJvYW1TYW1wJHZhbDYNCnJvYW1TYW1wJHZhbDcNCnJvYW1TYW1wJHZhbDgNCnJvYW1TYW1wJHZhbDkNCnJvYW1TYW1wJHZhbDEwDQoNCg0KDQpgYGANCg0KDQojIyBSZXN1bHQgOiBSb2FtaW5nLiANClJvYW1pbmcgYWxzbyBpcyBmb3VuZCB0byBoYXZlIHRoZSBzYW1lIGJlaGF2aW91ciBhcyB0aGUgb3RoZXIgdmFyaWFibGVzLiBUaGUgaGlnaGVzdCBxdWFudGlsZSB2YWx1ZXMgc2hvd3MgdGhlIG1heGltdW0gcHJvcGVuc2l0eSB0byBjaHVybi4NCg0KIyMgUm9hbWluZyBPdXRnb2luZw0KDQpgYGB7cn0NCiMgbWFrZSBhbiBlbXB0eSBkYXRhIGZyYW1lIA0KDQpjaHVybkZlYXQxIDwtIGRhdGEuZnJhbWUobWF0cml4KCBucm93ID0gOTk5OTksIG5jb2wgPSAwKSkNCg0KDQpjaHVybkZlYXQxIDwtIGNiaW5kKGNodXJuRmVhdDEscm9hbVNhbXAkZGYxJFNEKQ0KDQoNCg0KY29sbmFtZXMoY2h1cm5GZWF0MSkgPC0gYygncm9hbV9pY19TRCcpDQoNCmhlYWQoY2h1cm5GZWF0MSkNCg0KYGBgDQoNCg0KDQoNCmBgYHtyfQ0KDQpyb2FtU2FtcCA8LSBzY2FsZXJGdW4oJ3JvYW1fb2dfbW91XzYnLCdyb2FtX29nX21vdV83Jywncm9hbV9vZ19tb3VfOCcpDQpyb2FtU2FtcCRkZjENCnJvYW1TYW1wJHZhbDENCnJvYW1TYW1wJHZhbDINCnJvYW1TYW1wJHZhbDMNCnJvYW1TYW1wJHZhbDQNCnJvYW1TYW1wJHZhbDUNCnJvYW1TYW1wJHZhbDYNCnJvYW1TYW1wJHZhbDcNCnJvYW1TYW1wJHZhbDgNCnJvYW1TYW1wJHZhbDkNCnJvYW1TYW1wJHZhbDEwDQoNCmNodXJuRmVhdDEgPC0gY2JpbmQoY2h1cm5GZWF0MSxyb2FtU2FtcCRkZjEkU0QpDQoNCg0KDQpjb2xuYW1lcyhjaHVybkZlYXQxKSA8LSBjKCdyb2FtX2ljX1NEJywncm9hbV9vZ19TRCcpDQoNCmhlYWQoY2h1cm5GZWF0MSkNCg0KYGBgDQoNCiMjIExvY2F0aW9uIG91dGdvaW5nIHNhbWUgdGVsZWNvbSBwcm92aWRlcg0KDQpgYGB7cn0NCnJvYW1TYW1wIDwtIHNjYWxlckZ1bignbG9jX29nX3QydF9tb3VfNicsJ2xvY19vZ190MnRfbW91XzcnLCdsb2Nfb2dfdDJ0X21vdV84JykNCnJvYW1TYW1wJGRmMQ0Kcm9hbVNhbXAkdmFsMQ0Kcm9hbVNhbXAkdmFsMg0Kcm9hbVNhbXAkdmFsMw0Kcm9hbVNhbXAkdmFsNA0Kcm9hbVNhbXAkdmFsNQ0Kcm9hbVNhbXAkdmFsNg0Kcm9hbVNhbXAkdmFsNw0Kcm9hbVNhbXAkdmFsOA0Kcm9hbVNhbXAkdmFsOQ0Kcm9hbVNhbXAkdmFsMTANCg0KY2h1cm5GZWF0MSA8LSBjYmluZChjaHVybkZlYXQxLHJvYW1TYW1wJGRmMSRTRCkNCg0KDQoNCmNvbG5hbWVzKGNodXJuRmVhdDEpIDwtIGMoJ3JvYW1faWNfU0QnLCdyb2FtX29nX1NEJywnbG9jX29nX3QydF9TRCcpDQoNCmhlYWQoY2h1cm5GZWF0MSkNCg0KYGBgDQoNCkxvY2FsIGNhbGxzIHdpdGhpbiB0aGUgc2FtZSBuZXR3b3JrIHdpdGhpbiB0aGUgbmV0d29yayBvZiB0aGUgc2FtZSB0ZWxlY29tIG9wZXJhdG9yIHNob3dzIGEgcmV2ZXJzZSB0cmVuZCB3aGVyZSBsb3cgZmxleCB6b25lIGhhcyBoaWdoZXIgcHJvYmFiaWxpdHkgb2YgZmluZGluZyBjaHVybiBjYXNlcy4NCg0KIyMgTG9jYWwgY2FsbHMgZnJvbSBvcGVyYXRvciB0byBtb2JpbGUgb2Ygb3RoZXIgb3BlcmF0b3INCg0KDQpgYGB7cn0NCnJvYW1TYW1wIDwtIHNjYWxlckZ1bignbG9jX29nX3QybV9tb3VfNicsJ2xvY19vZ190Mm1fbW91XzcnLCdsb2Nfb2dfdDJtX21vdV84JykNCnJvYW1TYW1wJGRmMQ0Kcm9hbVNhbXAkdmFsMQ0Kcm9hbVNhbXAkdmFsMg0Kcm9hbVNhbXAkdmFsMw0Kcm9hbVNhbXAkdmFsNA0Kcm9hbVNhbXAkdmFsNQ0Kcm9hbVNhbXAkdmFsNg0Kcm9hbVNhbXAkdmFsNw0Kcm9hbVNhbXAkdmFsOA0Kcm9hbVNhbXAkdmFsOQ0Kcm9hbVNhbXAkdmFsMTANCg0KY2h1cm5GZWF0MSA8LSBjYmluZChjaHVybkZlYXQxLHJvYW1TYW1wJGRmMSRTRCkNCg0KDQoNCmNvbG5hbWVzKGNodXJuRmVhdDEpIDwtIGMoJ3JvYW1faWNfU0QnLCdyb2FtX29nX1NEJywnbG9jX29nX3QydF9TRCcsJ2xvY19vZ190Mm1fU0QnKQ0KDQpoZWFkKGNodXJuRmVhdDEpDQpgYGANCg0KVGhlIHByb3BvcnRpb24gb2YgdGhlIGNodXJuIGNhc2VzIGFyZSBtb3JlIGluIHRoZSBsb3dlciByYW5nZXMgb2Ygc3RhbmRhcmQgZGV2aWF0aW9uDQoNCiMjIE9wZXJhdG9yIHRvIGZpeGVkIGxpbmVzIG9mIHRoZSBvcGVyYXRvciwgb3V0Z29pbmcNCg0KYGBge3J9DQpyb2FtU2FtcCA8LSBzY2FsZXJGdW4oJ2xvY19vZ190MmZfbW91XzYnLCdsb2Nfb2dfdDJmX21vdV83JywnbG9jX29nX3QyZl9tb3VfOCcpDQpyb2FtU2FtcCRkZjENCnJvYW1TYW1wJHZhbDENCnJvYW1TYW1wJHZhbDINCnJvYW1TYW1wJHZhbDMNCnJvYW1TYW1wJHZhbDQNCnJvYW1TYW1wJHZhbDUNCnJvYW1TYW1wJHZhbDYNCnJvYW1TYW1wJHZhbDcNCnJvYW1TYW1wJHZhbDgNCnJvYW1TYW1wJHZhbDkNCnJvYW1TYW1wJHZhbDEwDQoNCmNodXJuRmVhdDEgPC0gY2JpbmQoY2h1cm5GZWF0MSxyb2FtU2FtcCRkZjEkU0QpDQoNCg0KDQpjb2xuYW1lcyhjaHVybkZlYXQxKSA8LSBjKCdyb2FtX2ljX1NEJywncm9hbV9vZ19TRCcsJ2xvY19vZ190MnRfU0QnLCdsb2Nfb2dfdDJtX1NEJywnbG9jX29nX3QyZl9TRCcpDQoNCmhlYWQoY2h1cm5GZWF0MSkNCg0KYGBgDQoNCk5vdCBtdWNoIGluZm9ybWF0aW9uIGluIHRoaXMgZmVhdHVyZS4NCg0KIyMgT3BlcmF0b3IgdG8gaXRzIG93biBjYWxsIGNlbnRyZQ0KRG8gY2FsbHMgdG8gb25lcyBjYWxsIGNlbnRyZSBpbmRpY2F0ZSBhIHByb3BlbnNpdHkgZm9yIGNodXJuID8NCg0KYGBge3J9DQpyb2FtU2FtcCA8LSBzY2FsZXJGdW4oJ2xvY19vZ190MmNfbW91XzYnLCdsb2Nfb2dfdDJjX21vdV83JywnbG9jX29nX3QyY19tb3VfOCcpDQpyb2FtU2FtcCRkZjENCnJvYW1TYW1wJHZhbDENCnJvYW1TYW1wJHZhbDINCnJvYW1TYW1wJHZhbDMNCnJvYW1TYW1wJHZhbDQNCnJvYW1TYW1wJHZhbDUNCnJvYW1TYW1wJHZhbDYNCnJvYW1TYW1wJHZhbDcNCnJvYW1TYW1wJHZhbDgNCnJvYW1TYW1wJHZhbDkNCnJvYW1TYW1wJHZhbDEwDQoNCmNodXJuRmVhdDEgPC0gY2JpbmQoY2h1cm5GZWF0MSxyb2FtU2FtcCRkZjEkU0QpDQoNCg0KDQpjb2xuYW1lcyhjaHVybkZlYXQxKSA8LSBjKCdyb2FtX2ljX1NEJywncm9hbV9vZ19TRCcsJ2xvY19vZ190MnRfU0QnLCdsb2Nfb2dfdDJtX1NEJywnbG9jX29nX3QyZl9TRCcsJ2xvY19vZ190MmNfU0QnKQ0KDQpoZWFkKGNodXJuRmVhdDEpDQoNCmBgYA0KTm90IG11Y2ggaW5mb3JtYXRpb24gaW4gdGhpcyBkYXRhIHBvaW50LiANCg0KIyMgTG9jYWwgb3V0Z29pbmcNCg0KYGBge3J9DQpyb2FtU2FtcCA8LSBzY2FsZXJGdW4oJ2xvY19vZ19tb3VfNicsJ2xvY19vZ19tb3VfNycsJ2xvY19vZ19tb3VfOCcpDQpyb2FtU2FtcCRkZjENCnJvYW1TYW1wJHZhbDENCnJvYW1TYW1wJHZhbDINCnJvYW1TYW1wJHZhbDMNCnJvYW1TYW1wJHZhbDQNCnJvYW1TYW1wJHZhbDUNCnJvYW1TYW1wJHZhbDYNCnJvYW1TYW1wJHZhbDcNCnJvYW1TYW1wJHZhbDgNCnJvYW1TYW1wJHZhbDkNCnJvYW1TYW1wJHZhbDEwDQoNCmNodXJuRmVhdDEgPC0gY2JpbmQoY2h1cm5GZWF0MSxyb2FtU2FtcCRkZjEkU0QpDQoNCg0KDQpjb2xuYW1lcyhjaHVybkZlYXQxKSA8LSBjKCdyb2FtX2ljX1NEJywncm9hbV9vZ19TRCcsJ2xvY19vZ190MnRfU0QnLCdsb2Nfb2dfdDJtX1NEJywnbG9jX29nX3QyZl9TRCcsJ2xvY19vZ190MmNfU0QnLCdsb2Nfb2dfU0QnKQ0KDQpoZWFkKGNodXJuRmVhdDEpDQoNCmBgYA0KDQoNCkxvd2VyIHJhbmdlIG9mIHRoaXMgaGFzIGFyb3VuZCA0MCUgb2YgY2h1cm4gY2FzZXMuDQoNCiMjIFNURCBvdXRnb2luZyBpbnRlciBvcGVyYXRvciBjYWxscy4NCg0KYGBge3J9DQpyb2FtU2FtcCA8LSBzY2FsZXJGdW4oJ3N0ZF9vZ190MnRfbW91XzYnLCdzdGRfb2dfdDJ0X21vdV83Jywnc3RkX29nX3QydF9tb3VfOCcpDQpyb2FtU2FtcCRkZjENCnJvYW1TYW1wJHZhbDENCnJvYW1TYW1wJHZhbDINCnJvYW1TYW1wJHZhbDMNCnJvYW1TYW1wJHZhbDQNCnJvYW1TYW1wJHZhbDUNCnJvYW1TYW1wJHZhbDYNCnJvYW1TYW1wJHZhbDcNCnJvYW1TYW1wJHZhbDgNCnJvYW1TYW1wJHZhbDkNCnJvYW1TYW1wJHZhbDEwDQoNCmNodXJuRmVhdDEgPC0gY2JpbmQoY2h1cm5GZWF0MSxyb2FtU2FtcCRkZjEkU0QpDQoNCg0KDQpjb2xuYW1lcyhjaHVybkZlYXQxKSA8LSBjKCdyb2FtX2ljX1NEJywncm9hbV9vZ19TRCcsJ2xvY19vZ190MnRfU0QnLCdsb2Nfb2dfdDJtX1NEJywnbG9jX29nX3QyZl9TRCcsJ2xvY19vZ190MmNfU0QnLCdsb2Nfb2dfU0QnLCdzdGRfb2dfdDJ0X1NEJykNCg0KaGVhZChjaHVybkZlYXQxKQ0KDQpgYGANCg0KDQpUaGUgaGlnaGVyIGVuZCBvZiB0aGUgc3BlY3RydW0gc2hvd3MgdGhlIGhpZ2hlc3QgcHJvcGVuc2l0eSB0byBjaHVybi5Ub3AgdGhyZWUgYmFuZHMgb2YgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBoYXMgdGhlIGhpZ2hlc3QgcHJvcGVuc2l0eS4NCg0KIyMgU1REIG91dGdvaW5nIE9wZXJhdG9yIHRvIGFub3RoZXIgb3BlcmF0b3IgbW9iaWxlLg0KDQpgYGB7cn0NCnJvYW1TYW1wIDwtIHNjYWxlckZ1bignc3RkX29nX3QybV9tb3VfNicsJ3N0ZF9vZ190Mm1fbW91XzcnLCdzdGRfb2dfdDJtX21vdV84JykNCnJvYW1TYW1wJGRmMQ0Kcm9hbVNhbXAkdmFsMQ0Kcm9hbVNhbXAkdmFsMg0Kcm9hbVNhbXAkdmFsMw0Kcm9hbVNhbXAkdmFsNA0Kcm9hbVNhbXAkdmFsNQ0Kcm9hbVNhbXAkdmFsNg0Kcm9hbVNhbXAkdmFsNw0Kcm9hbVNhbXAkdmFsOA0Kcm9hbVNhbXAkdmFsOQ0Kcm9hbVNhbXAkdmFsMTANCg0KY2h1cm5GZWF0MSA8LSBjYmluZChjaHVybkZlYXQxLHJvYW1TYW1wJGRmMSRTRCkNCg0KDQoNCmNvbG5hbWVzKGNodXJuRmVhdDEpIDwtIGMoJ3JvYW1faWNfU0QnLCdyb2FtX29nX1NEJywnbG9jX29nX3QydF9TRCcsJ2xvY19vZ190Mm1fU0QnLCdsb2Nfb2dfdDJmX1NEJywnbG9jX29nX3QyY19TRCcsJ2xvY19vZ19TRCcsJ3N0ZF9vZ190MnRfU0QnLCdzdGRfb2dfdDJtX1NEJykNCg0KaGVhZChjaHVybkZlYXQxKQ0KDQpgYGANCg0KVGhlIHRvcCBlbmQgb2YgdGhlIHNwZWN0cnVtIGhhcyB0aGUgaGVpZ2hlc3QgcHJvcGVuc2l0eSBvZiBjaHVybi4NCg0KIyMgU1REIG91dGdvaW5nIGZyb20gc2FtZSBvcGVyYXRvciB0byBmaXhlZCBsaW5lDQoNCmBgYHtyfQ0Kcm9hbVNhbXAgPC0gc2NhbGVyRnVuKCdzdGRfb2dfdDJmX21vdV82Jywnc3RkX29nX3QyZl9tb3VfNycsJ3N0ZF9vZ190MmZfbW91XzgnKQ0Kcm9hbVNhbXAkZGYxDQpyb2FtU2FtcCR2YWwxDQpyb2FtU2FtcCR2YWwyDQpyb2FtU2FtcCR2YWwzDQpyb2FtU2FtcCR2YWw0DQpyb2FtU2FtcCR2YWw1DQpyb2FtU2FtcCR2YWw2DQpyb2FtU2FtcCR2YWw3DQpyb2FtU2FtcCR2YWw4DQpyb2FtU2FtcCR2YWw5DQpyb2FtU2FtcCR2YWwxMA0KDQpjaHVybkZlYXQxIDwtIGNiaW5kKGNodXJuRmVhdDEscm9hbVNhbXAkZGYxJFNEKQ0KDQoNCg0KY29sbmFtZXMoY2h1cm5GZWF0MSkgPC0gYygncm9hbV9pY19TRCcsJ3JvYW1fb2dfU0QnLCdsb2Nfb2dfdDJ0X1NEJywnbG9jX29nX3QybV9TRCcsJ2xvY19vZ190MmZfU0QnLCdsb2Nfb2dfdDJjX1NEJywnbG9jX29nX1NEJywnc3RkX29nX3QydF9TRCcsJ3N0ZF9vZ190Mm1fU0QnLCdzdGRfb2dfdDJmX1NEJykNCg0KaGVhZChjaHVybkZlYXQxKQ0KDQpgYGANCg0KQXMgZXhwZWN0ZWQgdGhlIGZsdXggaW4gZml4ZWQgbGluZXMgZG9zZW50IHByZXNlbnQgYW55IG1lYW5pbmdmdWwgaW5kaWNhdG9yIGF0IGFsbC4NCg0KIyMgU1REIG91dGdvaW5nIGNvbnNvbGlkYXRlZA0KDQpgYGB7cn0NCnJvYW1TYW1wIDwtIHNjYWxlckZ1bignc3RkX29nX21vdV82Jywnc3RkX29nX21vdV83Jywnc3RkX29nX21vdV84JykNCnJvYW1TYW1wJGRmMQ0Kcm9hbVNhbXAkdmFsMQ0Kcm9hbVNhbXAkdmFsMg0Kcm9hbVNhbXAkdmFsMw0Kcm9hbVNhbXAkdmFsNA0Kcm9hbVNhbXAkdmFsNQ0Kcm9hbVNhbXAkdmFsNg0Kcm9hbVNhbXAkdmFsNw0Kcm9hbVNhbXAkdmFsOA0Kcm9hbVNhbXAkdmFsOQ0Kcm9hbVNhbXAkdmFsMTANCmNodXJuRmVhdDEgPC0gY2JpbmQoY2h1cm5GZWF0MSxyb2FtU2FtcCRkZjEkU0QpDQoNCg0KDQpjb2xuYW1lcyhjaHVybkZlYXQxKSA8LSBjKCdyb2FtX2ljX1NEJywncm9hbV9vZ19TRCcsJ2xvY19vZ190MnRfU0QnLCdsb2Nfb2dfdDJtX1NEJywnbG9jX29nX3QyZl9TRCcsJ2xvY19vZ190MmNfU0QnLCdsb2Nfb2dfU0QnLCdzdGRfb2dfdDJ0X1NEJywnc3RkX29nX3QybV9TRCcsJ3N0ZF9vZ190MmZfU0QnLCdzdGRfb2dfU0QnKQ0KDQpoZWFkKGNodXJuRmVhdDEpDQoNCmBgYA0KDQpUaGVyZSBpcyBhIG1pbGQgcGFyYWJvbGljIHJlcHJlc2VudGF0aW9uIHdpdGggdGhlIHRvcCBzdGFuZGFyZCBkZXZpYXRpb24gdmFsdWVzIGhhdmluZyB0aGUgaGlnaGVyIHByb2JhYmlsaXR5IG9mIGNodXJuIHByb3BlbnNpdHkuDQoNCiMjIElTRCBvdXRnb2luZw0KDQpgYGB7cn0NCg0Kcm9hbVNhbXAgPC0gc2NhbGVyRnVuKCdpc2Rfb2dfbW91XzYnLCdpc2Rfb2dfbW91XzcnLCdpc2Rfb2dfbW91XzgnKQ0Kcm9hbVNhbXAkZGYxDQpyb2FtU2FtcCR2YWwxDQpyb2FtU2FtcCR2YWwyDQpyb2FtU2FtcCR2YWwzDQpyb2FtU2FtcCR2YWw0DQpyb2FtU2FtcCR2YWw1DQpyb2FtU2FtcCR2YWw2DQpyb2FtU2FtcCR2YWw3DQpyb2FtU2FtcCR2YWw4DQpyb2FtU2FtcCR2YWw5DQpyb2FtU2FtcCR2YWwxMA0KDQpjaHVybkZlYXQxIDwtIGNiaW5kKGNodXJuRmVhdDEscm9hbVNhbXAkZGYxJFNEKQ0KDQoNCg0KY29sbmFtZXMoY2h1cm5GZWF0MSkgPC0gYygncm9hbV9pY19TRCcsJ3JvYW1fb2dfU0QnLCdsb2Nfb2dfdDJ0X1NEJywnbG9jX29nX3QybV9TRCcsJ2xvY19vZ190MmZfU0QnLCdsb2Nfb2dfdDJjX1NEJywnbG9jX29nX1NEJywnc3RkX29nX3QydF9TRCcsJ3N0ZF9vZ190Mm1fU0QnLCdzdGRfb2dfdDJmX1NEJywnc3RkX29nX1NEJywnaXNkX29nX1NEJykNCg0KaGVhZChjaHVybkZlYXQxKQ0KDQpgYGANCg0KVGhlIGhpZ2hlc3QgYmFuZCBoYXMgdGhlIGdyZWF0ZXN0IHByb2JhYmlsaXR5IG9mIGZpbmRpbmcgY2h1cm4uDQoNCiMjIFNwZWNpYWwgb3V0Z29pbmcgY2FsbHMNCg0KYGBge3J9DQpyb2FtU2FtcCA8LSBzY2FsZXJGdW4oJ3NwbF9vZ19tb3VfNicsJ3NwbF9vZ19tb3VfNycsJ3NwbF9vZ19tb3VfOCcpDQpyb2FtU2FtcCRkZjENCnJvYW1TYW1wJHZhbDENCnJvYW1TYW1wJHZhbDINCnJvYW1TYW1wJHZhbDMNCnJvYW1TYW1wJHZhbDQNCnJvYW1TYW1wJHZhbDUNCnJvYW1TYW1wJHZhbDYNCnJvYW1TYW1wJHZhbDcNCnJvYW1TYW1wJHZhbDgNCnJvYW1TYW1wJHZhbDkNCnJvYW1TYW1wJHZhbDEwDQoNCmNodXJuRmVhdDEgPC0gY2JpbmQoY2h1cm5GZWF0MSxyb2FtU2FtcCRkZjEkU0QpDQoNCg0KDQpjb2xuYW1lcyhjaHVybkZlYXQxKSA8LSBjKCdyb2FtX2ljX1NEJywncm9hbV9vZ19TRCcsJ2xvY19vZ190MnRfU0QnLCdsb2Nfb2dfdDJtX1NEJywnbG9jX29nX3QyZl9TRCcsJ2xvY19vZ190MmNfU0QnLCdsb2Nfb2dfU0QnLCdzdGRfb2dfdDJ0X1NEJywnc3RkX29nX3QybV9TRCcsJ3N0ZF9vZ190MmZfU0QnLCdzdGRfb2dfU0QnLCdpc2Rfb2dfU0QnLCdzcGxfb2dfU0QnKQ0KDQpoZWFkKGNodXJuRmVhdDEpDQoNCmBgYA0KDQoNCk5vdCBtdWNoIGRpZmZlcmVuY2UgaW4gdGhpcyBzZWdtZW50Lg0KDQojIyBvdXRnb2luZyBvdGhlcnMNCg0KYGBge3J9DQpyb2FtU2FtcCA8LSBzY2FsZXJGdW4oJ29nX290aGVyc182Jywnb2dfb3RoZXJzXzcnLCdvZ19vdGhlcnNfOCcpDQpyb2FtU2FtcCRkZjENCnJvYW1TYW1wJHZhbDENCnJvYW1TYW1wJHZhbDINCnJvYW1TYW1wJHZhbDMNCnJvYW1TYW1wJHZhbDQNCnJvYW1TYW1wJHZhbDUNCnJvYW1TYW1wJHZhbDYNCnJvYW1TYW1wJHZhbDcNCnJvYW1TYW1wJHZhbDgNCnJvYW1TYW1wJHZhbDkNCnJvYW1TYW1wJHZhbDEwDQoNCmNodXJuRmVhdDEgPC0gY2JpbmQoY2h1cm5GZWF0MSxyb2FtU2FtcCRkZjEkU0QpDQoNCg0KDQpjb2xuYW1lcyhjaHVybkZlYXQxKSA8LSBjKCdyb2FtX2ljX1NEJywncm9hbV9vZ19TRCcsJ2xvY19vZ190MnRfU0QnLCdsb2Nfb2dfdDJtX1NEJywnbG9jX29nX3QyZl9TRCcsJ2xvY19vZ190MmNfU0QnLCdsb2Nfb2dfU0QnLCdzdGRfb2dfdDJ0X1NEJywnc3RkX29nX3QybV9TRCcsJ3N0ZF9vZ190MmZfU0QnLCdzdGRfb2dfU0QnLCdpc2Rfb2dfU0QnLCdzcGxfb2dfU0QnLCdvZ19vdGhlcnNfU0QnKQ0KDQpoZWFkKGNodXJuRmVhdDEpDQpgYGANCg0KVGhlIHRvcCBvbmUgaGFzIHRoZSBtb3N0IHByb3BlbnNpdHkuIEhvd2V2ZXIgbm90IG11Y2ggdG8gdGFsayBhYm91dC4NCg0KIyMgQ29uc29saWRhdGUgb3V0Z29pbmcgdHJlbmQNCg0KYGBge3J9DQpyb2FtU2FtcCA8LSBzY2FsZXJGdW4oJ3RvdGFsX29nX21vdV82JywndG90YWxfb2dfbW91XzcnLCd0b3RhbF9vZ19tb3VfOCcpDQpyb2FtU2FtcCRkZjENCnJvYW1TYW1wJHZhbDENCnJvYW1TYW1wJHZhbDINCnJvYW1TYW1wJHZhbDMNCnJvYW1TYW1wJHZhbDQNCnJvYW1TYW1wJHZhbDUNCnJvYW1TYW1wJHZhbDYNCnJvYW1TYW1wJHZhbDcNCnJvYW1TYW1wJHZhbDgNCnJvYW1TYW1wJHZhbDkNCnJvYW1TYW1wJHZhbDEwDQoNCmNodXJuRmVhdDEgPC0gY2JpbmQoY2h1cm5GZWF0MSxyb2FtU2FtcCRkZjEkU0QpDQoNCg0KDQpjb2xuYW1lcyhjaHVybkZlYXQxKSA8LSBjKCdyb2FtX2ljX1NEJywncm9hbV9vZ19TRCcsJ2xvY19vZ190MnRfU0QnLCdsb2Nfb2dfdDJtX1NEJywnbG9jX29nX3QyZl9TRCcsJ2xvY19vZ190MmNfU0QnLCdsb2Nfb2dfU0QnLCdzdGRfb2dfdDJ0X1NEJywnc3RkX29nX3QybV9TRCcsJ3N0ZF9vZ190MmZfU0QnLCdzdGRfb2dfU0QnLCdpc2Rfb2dfU0QnLCdzcGxfb2dfU0QnLCdvZ19vdGhlcnNfU0QnLCd0b3RhbF9vZ19TRCcpDQoNCmhlYWQoY2h1cm5GZWF0MSkNCg0KYGBgDQoNClRoZXJlIGlzIGEgcGFyYWJvbGljIHJlbGF0aW9uc2lwLiBXaXRoIHNvbWUgb2YgdGhlIGhpZ2hlc3QgcmVwcmVzZW50YXRpb24gYXQgdGhlIGJvdHRvbSBlbmQgb2YgdGhlIHN0ZCByYW5nZS4gVGhlIHRvcCBhbHNvIHNob3dpbmcgc29tZSBwcm9wZW5zaXR5IGZvciB0aGUgc2FtZS4gVGhlIGJvdHRvbSBlbmQgbXVzdCBiZSBoZWF2aWx5IGluZmx1ZW5jZWQgYnkgc29tZSBvZiB0aGUgNDAlIHJhbmdlIGZlYXR1cmVzLg0KDQojIyBMb2NhbCBpbmNvbWluZyBjYWxscyB3aXRoaW4gdGhlIHNhbWUgdGVsZWNvbSBuZXR3b3JrDQoNCmBgYHtyfQ0Kcm9hbVNhbXAgPC0gc2NhbGVyRnVuKCdsb2NfaWNfdDJ0X21vdV82JywnbG9jX2ljX3QydF9tb3VfNycsJ2xvY19pY190MnRfbW91XzgnKQ0Kcm9hbVNhbXAkZGYxDQpyb2FtU2FtcCR2YWwxDQpyb2FtU2FtcCR2YWwyDQpyb2FtU2FtcCR2YWwzDQpyb2FtU2FtcCR2YWw0DQpyb2FtU2FtcCR2YWw1DQpyb2FtU2FtcCR2YWw2DQpyb2FtU2FtcCR2YWw3DQpyb2FtU2FtcCR2YWw4DQpyb2FtU2FtcCR2YWw5DQpyb2FtU2FtcCR2YWwxMA0KDQpjaHVybkZlYXQxIDwtIGNiaW5kKGNodXJuRmVhdDEscm9hbVNhbXAkZGYxJFNEKQ0KDQoNCg0KY29sbmFtZXMoY2h1cm5GZWF0MSkgPC0gYygncm9hbV9pY19TRCcsJ3JvYW1fb2dfU0QnLCdsb2Nfb2dfdDJ0X1NEJywnbG9jX29nX3QybV9TRCcsJ2xvY19vZ190MmZfU0QnLCdsb2Nfb2dfdDJjX1NEJywnbG9jX29nX1NEJywnc3RkX29nX3QydF9TRCcsJ3N0ZF9vZ190Mm1fU0QnLCdzdGRfb2dfdDJmX1NEJywnc3RkX29nX1NEJywnaXNkX29nX1NEJywnc3BsX29nX1NEJywnb2dfb3RoZXJzX1NEJywndG90YWxfb2dfU0QnLCdsb2NfaWNfdDJ0X1NEJykNCg0KaGVhZChjaHVybkZlYXQxKQ0KDQpgYGANClRoZSBib3R0b20gMTUwMDAgY2FzZXMgaGFzIHRoZSBoaWdoZXN0IHByb3BlbnNpdHkgZm9yIGNodXJuIDI0JQ0KDQojIyBMb2NhbCBpbmNvbWluZyBvcGVyYXRvciB0byBkaWZmZXJlbnQgbW9iaWxlIG5ldHdvcmsNCg0KYGBge3J9DQpyb2FtU2FtcCA8LSBzY2FsZXJGdW4oJ2xvY19pY190Mm1fbW91XzYnLCdsb2NfaWNfdDJtX21vdV83JywnbG9jX2ljX3QybV9tb3VfOCcpDQpyb2FtU2FtcCRkZjENCnJvYW1TYW1wJHZhbDENCnJvYW1TYW1wJHZhbDINCnJvYW1TYW1wJHZhbDMNCnJvYW1TYW1wJHZhbDQNCnJvYW1TYW1wJHZhbDUNCnJvYW1TYW1wJHZhbDYNCnJvYW1TYW1wJHZhbDcNCnJvYW1TYW1wJHZhbDgNCnJvYW1TYW1wJHZhbDkNCnJvYW1TYW1wJHZhbDEwDQoNCmNodXJuRmVhdDEgPC0gY2JpbmQoY2h1cm5GZWF0MSxyb2FtU2FtcCRkZjEkU0QpDQoNCg0KDQpjb2xuYW1lcyhjaHVybkZlYXQxKSA8LSBjKCdyb2FtX2ljX1NEJywncm9hbV9vZ19TRCcsJ2xvY19vZ190MnRfU0QnLCdsb2Nfb2dfdDJtX1NEJywnbG9jX29nX3QyZl9TRCcsJ2xvY19vZ190MmNfU0QnLCdsb2Nfb2dfU0QnLCdzdGRfb2dfdDJ0X1NEJywnc3RkX29nX3QybV9TRCcsJ3N0ZF9vZ190MmZfU0QnLCdzdGRfb2dfU0QnLCdpc2Rfb2dfU0QnLCdzcGxfb2dfU0QnLCdvZ19vdGhlcnNfU0QnLCd0b3RhbF9vZ19TRCcsJ2xvY19pY190MnRfU0QnLCdsb2NfaWNfdDJtX1NEJykNCg0KaGVhZChjaHVybkZlYXQxKQ0KDQpgYGANCg0KVGhlIGJvdHRvbSBoYXMgYSB2ZXJ5IGhpZ2ggcGVyY2VudGFnZSBvZiBjaHVybiBhYm91dCA0MyUuDQoNCiMjTG9jYWwgaW5jb21pbmcgdGVsZWNvbSBvcGVyYXRvciB0byBhIGZpeGVkIGxpbmUNCg0KYGBge3J9DQpyb2FtU2FtcCA8LSBzY2FsZXJGdW4oJ2xvY19pY190MmZfbW91XzYnLCdsb2NfaWNfdDJmX21vdV83JywnbG9jX2ljX3QyZl9tb3VfOCcpDQpyb2FtU2FtcCRkZjENCnJvYW1TYW1wJHZhbDENCnJvYW1TYW1wJHZhbDINCnJvYW1TYW1wJHZhbDMNCnJvYW1TYW1wJHZhbDQNCnJvYW1TYW1wJHZhbDUNCnJvYW1TYW1wJHZhbDYNCnJvYW1TYW1wJHZhbDcNCnJvYW1TYW1wJHZhbDgNCnJvYW1TYW1wJHZhbDkNCnJvYW1TYW1wJHZhbDEwDQoNCmNodXJuRmVhdDEgPC0gY2JpbmQoY2h1cm5GZWF0MSxyb2FtU2FtcCRkZjEkU0QpDQoNCg0KDQpjb2xuYW1lcyhjaHVybkZlYXQxKSA8LSBjKCdyb2FtX2ljX1NEJywncm9hbV9vZ19TRCcsJ2xvY19vZ190MnRfU0QnLCdsb2Nfb2dfdDJtX1NEJywnbG9jX29nX3QyZl9TRCcsJ2xvY19vZ190MmNfU0QnLCdsb2Nfb2dfU0QnLCdzdGRfb2dfdDJ0X1NEJywnc3RkX29nX3QybV9TRCcsJ3N0ZF9vZ190MmZfU0QnLCdzdGRfb2dfU0QnLCdpc2Rfb2dfU0QnLCdzcGxfb2dfU0QnLCdvZ19vdGhlcnNfU0QnLCd0b3RhbF9vZ19TRCcsJ2xvY19pY190MnRfU0QnLCdsb2NfaWNfdDJtX1NEJywnbG9jX2ljX3QyZl9TRCcpDQoNCmhlYWQoY2h1cm5GZWF0MSkNCg0KYGBgDQoNClRoZSBib3R0b20gbGF5ZXIgaGFzIHRoZSBoaWdoZXN0IHByb3BlbnNpdHkgZm9yIGNodXJuLg0KDQojIyBMb2NhbCBJbmNvbWluZyANCg0KYGBge3J9DQpyb2FtU2FtcCA8LSBzY2FsZXJGdW4oJ2xvY19pY19tb3VfNicsJ2xvY19pY19tb3VfNycsJ2xvY19pY19tb3VfOCcpDQpyb2FtU2FtcCRkZjENCnJvYW1TYW1wJHZhbDENCnJvYW1TYW1wJHZhbDINCnJvYW1TYW1wJHZhbDMNCnJvYW1TYW1wJHZhbDQNCnJvYW1TYW1wJHZhbDUNCnJvYW1TYW1wJHZhbDYNCnJvYW1TYW1wJHZhbDcNCnJvYW1TYW1wJHZhbDgNCnJvYW1TYW1wJHZhbDkNCnJvYW1TYW1wJHZhbDEwDQpjaHVybkZlYXQxIDwtIGNiaW5kKGNodXJuRmVhdDEscm9hbVNhbXAkZGYxJFNEKQ0KDQoNCg0KY29sbmFtZXMoY2h1cm5GZWF0MSkgPC0gYygncm9hbV9pY19TRCcsJ3JvYW1fb2dfU0QnLCdsb2Nfb2dfdDJ0X1NEJywnbG9jX29nX3QybV9TRCcsJ2xvY19vZ190MmZfU0QnLCdsb2Nfb2dfdDJjX1NEJywnbG9jX29nX1NEJywnc3RkX29nX3QydF9TRCcsJ3N0ZF9vZ190Mm1fU0QnLCdzdGRfb2dfdDJmX1NEJywnc3RkX29nX1NEJywnaXNkX29nX1NEJywnc3BsX29nX1NEJywnb2dfb3RoZXJzX1NEJywndG90YWxfb2dfU0QnLCdsb2NfaWNfdDJ0X1NEJywnbG9jX2ljX3QybV9TRCcsJ2xvY19pY190MmZfU0QnLCdsb2NfaWNfU0QnKQ0KDQpoZWFkKGNodXJuRmVhdDEpDQpgYGANCg0KVGhlIGJvdHRvbSA1MDAwIHdoaWNoIGhhcyB0aGUgbGVhc3Qgc3RhbmRhcmQgZGV2aWF0aW9uIGhhcyB0aGUgaGlnaGVyIHByb3BvcnRpb24gb2YgY2h1cm4gd2l0aCA0MiUuDQoNCiMjIFNURCBpbmNvbWluZyB3aXRoaW4gdGhlIHNhbWUgbmV0d29yaw0KDQpgYGB7cn0NCg0Kcm9hbVNhbXAgPC0gc2NhbGVyRnVuKCdzdGRfaWNfdDJ0X21vdV82Jywnc3RkX2ljX3QydF9tb3VfNycsJ3N0ZF9pY190MnRfbW91XzgnKQ0Kcm9hbVNhbXAkZGYxDQpyb2FtU2FtcCR2YWwxDQpyb2FtU2FtcCR2YWwyDQpyb2FtU2FtcCR2YWwzDQpyb2FtU2FtcCR2YWw0DQpyb2FtU2FtcCR2YWw1DQpyb2FtU2FtcCR2YWw2DQpyb2FtU2FtcCR2YWw3DQpyb2FtU2FtcCR2YWw4DQpyb2FtU2FtcCR2YWw5DQpyb2FtU2FtcCR2YWwxMA0KDQpjaHVybkZlYXQxIDwtIGNiaW5kKGNodXJuRmVhdDEscm9hbVNhbXAkZGYxJFNEKQ0KDQoNCg0KY29sbmFtZXMoY2h1cm5GZWF0MSkgPC0gYygncm9hbV9pY19TRCcsJ3JvYW1fb2dfU0QnLCdsb2Nfb2dfdDJ0X1NEJywnbG9jX29nX3QybV9TRCcsJ2xvY19vZ190MmZfU0QnLCdsb2Nfb2dfdDJjX1NEJywnbG9jX29nX1NEJywnc3RkX29nX3QydF9TRCcsJ3N0ZF9vZ190Mm1fU0QnLCdzdGRfb2dfdDJmX1NEJywnc3RkX29nX1NEJywnaXNkX29nX1NEJywnc3BsX29nX1NEJywnb2dfb3RoZXJzX1NEJywndG90YWxfb2dfU0QnLCdsb2NfaWNfdDJ0X1NEJywnbG9jX2ljX3QybV9TRCcsJ2xvY19pY190MmZfU0QnLCdsb2NfaWNfU0QnLCdzdGRfaWNfdDJ0X1NEJykNCg0KaGVhZChjaHVybkZlYXQxKQ0KDQpgYGANCg0KU1REIGluY29taW5nIGRvc2VudCBoYXZlIG11Y2ggb2YgYSBkaWZmZXJlbnRpYXRpb24gYW5kIHRoZSBjaHVybiBwZXJjZW50YWdlIGlzIGV2ZW5seSBkaXN0cmlidXRlZC4NCg0KIyMgU1REIGluY29taW5nIHdpdGhpbiBuZXR3b3JrIGZyb20gbW9iaWxlIG9mIG90aGVyIG9wZXJhdG9yDQoNCmBgYHtyfQ0Kcm9hbVNhbXAgPC0gc2NhbGVyRnVuKCdzdGRfaWNfdDJtX21vdV82Jywnc3RkX2ljX3QybV9tb3VfNycsJ3N0ZF9pY190Mm1fbW91XzgnKQ0Kcm9hbVNhbXAkZGYxDQpyb2FtU2FtcCR2YWwxDQpyb2FtU2FtcCR2YWwyDQpyb2FtU2FtcCR2YWwzDQpyb2FtU2FtcCR2YWw0DQpyb2FtU2FtcCR2YWw1DQpyb2FtU2FtcCR2YWw2DQpyb2FtU2FtcCR2YWw3DQpyb2FtU2FtcCR2YWw4DQpyb2FtU2FtcCR2YWw5DQpyb2FtU2FtcCR2YWwxMA0KDQpyb2FtU2FtcCA8LSBzY2FsZXJGdW4oJ3N0ZF9pY190MnRfbW91XzYnLCdzdGRfaWNfdDJ0X21vdV83Jywnc3RkX2ljX3QydF9tb3VfOCcpDQpyb2FtU2FtcCRkZjENCnJvYW1TYW1wJHZhbDENCnJvYW1TYW1wJHZhbDINCnJvYW1TYW1wJHZhbDMNCnJvYW1TYW1wJHZhbDQNCnJvYW1TYW1wJHZhbDUNCnJvYW1TYW1wJHZhbDYNCnJvYW1TYW1wJHZhbDcNCnJvYW1TYW1wJHZhbDgNCnJvYW1TYW1wJHZhbDkNCnJvYW1TYW1wJHZhbDEwDQoNCmNodXJuRmVhdDEgPC0gY2JpbmQoY2h1cm5GZWF0MSxyb2FtU2FtcCRkZjEkU0QpDQoNCg0KDQpjb2xuYW1lcyhjaHVybkZlYXQxKSA8LSBjKCdyb2FtX2ljX1NEJywncm9hbV9vZ19TRCcsJ2xvY19vZ190MnRfU0QnLCdsb2Nfb2dfdDJtX1NEJywnbG9jX29nX3QyZl9TRCcsJ2xvY19vZ190MmNfU0QnLCdsb2Nfb2dfU0QnLCdzdGRfb2dfdDJ0X1NEJywnc3RkX29nX3QybV9TRCcsJ3N0ZF9vZ190MmZfU0QnLCdzdGRfb2dfU0QnLCdpc2Rfb2dfU0QnLCdzcGxfb2dfU0QnLCdvZ19vdGhlcnNfU0QnLCd0b3RhbF9vZ19TRCcsJ2xvY19pY190MnRfU0QnLCdsb2NfaWNfdDJtX1NEJywnbG9jX2ljX3QyZl9TRCcsJ2xvY19pY19TRCcsJ3N0ZF9pY190MnRfU0QnLCdzdGRfaWNfdDJtX1NEJykNCg0KaGVhZChjaHVybkZlYXQxKQ0KDQpgYGANCg0KVGhpcyBpcyBhIHBhcmFib2xpYyBkaXN0cmlidXRpb24gd2l0aCB0aGUgbWF4aW11bSBwcm9wZW5zaXR5IHdpdGggdGhlIGJvdHRvbSBiYW5kIGFuZCBoaWdoIGJhbmQuIEhvd2V2ZXIgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBiYW5kcyBpcyBub3QgdGhhdCBwcm9ub3VuY2VkDQoNCiMjIFNURCBpbmNvbWluZyBmcm9tIGZpeGVkIGxpbmUgdG8gdGhlIG9wZXJhdG9yDQoNCmBgYHtyfQ0Kcm9hbVNhbXAgPC0gc2NhbGVyRnVuKCdzdGRfaWNfdDJmX21vdV82Jywnc3RkX2ljX3QyZl9tb3VfNycsJ3N0ZF9pY190MmZfbW91XzgnKQ0Kcm9hbVNhbXAkZGYxDQpyb2FtU2FtcCR2YWwxDQpyb2FtU2FtcCR2YWwyDQpyb2FtU2FtcCR2YWwzDQpyb2FtU2FtcCR2YWw0DQpyb2FtU2FtcCR2YWw1DQpyb2FtU2FtcCR2YWw2DQpyb2FtU2FtcCR2YWw3DQpyb2FtU2FtcCR2YWw4DQpyb2FtU2FtcCR2YWw5DQpyb2FtU2FtcCR2YWwxMA0KY2h1cm5GZWF0MSA8LSBjYmluZChjaHVybkZlYXQxLHJvYW1TYW1wJGRmMSRTRCkNCg0KDQoNCmNvbG5hbWVzKGNodXJuRmVhdDEpIDwtIGMoJ3JvYW1faWNfU0QnLCdyb2FtX29nX1NEJywnbG9jX29nX3QydF9TRCcsJ2xvY19vZ190Mm1fU0QnLCdsb2Nfb2dfdDJmX1NEJywnbG9jX29nX3QyY19TRCcsJ2xvY19vZ19TRCcsJ3N0ZF9vZ190MnRfU0QnLCdzdGRfb2dfdDJtX1NEJywnc3RkX29nX3QyZl9TRCcsJ3N0ZF9vZ19TRCcsJ2lzZF9vZ19TRCcsJ3NwbF9vZ19TRCcsJ29nX290aGVyc19TRCcsJ3RvdGFsX29nX1NEJywnbG9jX2ljX3QydF9TRCcsJ2xvY19pY190Mm1fU0QnLCdsb2NfaWNfdDJmX1NEJywnbG9jX2ljX1NEJywnc3RkX2ljX3QydF9TRCcsJ3N0ZF9pY190Mm1fU0QnLCdzdGRfaWNfdDJmX1NEJykNCg0KaGVhZChjaHVybkZlYXQxKQ0KYGBgDQoNCk5vdCBtdWNoIG9mIGRpZmZlcmVudGlhdGlvbg0KDQojIyBUb3RhbCBTVEQgaW5jb21pbmcNCg0KYGBge3J9DQpyb2FtU2FtcCA8LSBzY2FsZXJGdW4oJ3N0ZF9pY19tb3VfNicsJ3N0ZF9pY19tb3VfNycsJ3N0ZF9pY19tb3VfOCcpDQpyb2FtU2FtcCRkZjENCnJvYW1TYW1wJHZhbDENCnJvYW1TYW1wJHZhbDINCnJvYW1TYW1wJHZhbDMNCnJvYW1TYW1wJHZhbDQNCnJvYW1TYW1wJHZhbDUNCnJvYW1TYW1wJHZhbDYNCnJvYW1TYW1wJHZhbDcNCnJvYW1TYW1wJHZhbDgNCnJvYW1TYW1wJHZhbDkNCnJvYW1TYW1wJHZhbDEwDQoNCg0KY2h1cm5GZWF0MSA8LSBjYmluZChjaHVybkZlYXQxLHJvYW1TYW1wJGRmMSRTRCkNCg0KY29sbmFtZXMoY2h1cm5GZWF0MSkgPC0gYygncm9hbV9pY19TRCcsJ3JvYW1fb2dfU0QnLCdsb2Nfb2dfdDJ0X1NEJywnbG9jX29nX3QybV9TRCcsJ2xvY19vZ190MmZfU0QnLCdsb2Nfb2dfdDJjX1NEJywnbG9jX29nX1NEJywnc3RkX29nX3QydF9TRCcsJ3N0ZF9vZ190Mm1fU0QnLCdzdGRfb2dfdDJmX1NEJywnc3RkX29nX1NEJywnaXNkX29nX1NEJywnc3BsX29nX1NEJywnb2dfb3RoZXJzX1NEJywndG90YWxfb2dfU0QnLCdsb2NfaWNfdDJ0X1NEJywnbG9jX2ljX3QybV9TRCcsJ2xvY19pY190MmZfU0QnLCdsb2NfaWNfU0QnLCdzdGRfaWNfdDJ0X1NEJywnc3RkX2ljX3QybV9TRCcsJ3N0ZF9pY190MmZfU0QnLCdzdGRfaWNfU0QnKQ0KDQpoZWFkKGNodXJuRmVhdDEpDQpgYGANCg0KQSBwYXJhYm9saWMgcmVsYXRpb25zaGlwIHdpdGggdGhlIGJvdHRvbSBlbmQgaGF2aW5nIHRoZSBtYXhpbXVtIHByb3BlbnNpdHkgb2YgY2h1cm4NCg0KIyMgVG90YWwgaW5jb21pbmcgY2FsbHMgDQoNCmBgYHtyfQ0Kcm9hbVNhbXAgPC0gc2NhbGVyRnVuKCd0b3RhbF9pY19tb3VfNicsJ3RvdGFsX2ljX21vdV83JywndG90YWxfaWNfbW91XzgnKQ0Kcm9hbVNhbXAkZGYxDQpyb2FtU2FtcCR2YWwxDQpyb2FtU2FtcCR2YWwyDQpyb2FtU2FtcCR2YWwzDQpyb2FtU2FtcCR2YWw0DQpyb2FtU2FtcCR2YWw1DQpyb2FtU2FtcCR2YWw2DQpyb2FtU2FtcCR2YWw3DQpyb2FtU2FtcCR2YWw4DQpyb2FtU2FtcCR2YWw5DQpyb2FtU2FtcCR2YWwxMA0KDQpjaHVybkZlYXQxIDwtIGNiaW5kKGNodXJuRmVhdDEscm9hbVNhbXAkZGYxJFNEKQ0KDQpjb2xuYW1lcyhjaHVybkZlYXQxKSA8LSBjKCdyb2FtX2ljX1NEJywncm9hbV9vZ19TRCcsJ2xvY19vZ190MnRfU0QnLCdsb2Nfb2dfdDJtX1NEJywnbG9jX29nX3QyZl9TRCcsJ2xvY19vZ190MmNfU0QnLCdsb2Nfb2dfU0QnLCdzdGRfb2dfdDJ0X1NEJywnc3RkX29nX3QybV9TRCcsJ3N0ZF9vZ190MmZfU0QnLCdzdGRfb2dfU0QnLCdpc2Rfb2dfU0QnLCdzcGxfb2dfU0QnLCdvZ19vdGhlcnNfU0QnLCd0b3RhbF9vZ19TRCcsJ2xvY19pY190MnRfU0QnLCdsb2NfaWNfdDJtX1NEJywnbG9jX2ljX3QyZl9TRCcsJ2xvY19pY19TRCcsJ3N0ZF9pY190MnRfU0QnLCdzdGRfaWNfdDJtX1NEJywnc3RkX2ljX3QyZl9TRCcsJ3N0ZF9pY19TRCcsJ3RvdGFsX2ljX1NEJykNCg0KaGVhZChjaHVybkZlYXQxKQ0KDQpgYGANCg0KRm9yIHRvdGFsIGluY29taW5nIHRoZSBib3R0b20gNTAwMCBoYXMgdGhlIGhlaWdoZXN0ICUgb2YgY2h1cm4gY2FzZXMgd2l0aCBhbG1vc3QgNDAlLiBUaGlzIGNvdWxkIGJlIG9uIHRoZSBiYXNpcyBvZiB0aGUgZmVhdHVyZSB3aXRoIDQzJSBjaHVybiBwZXJjZW50YWdlDQoNCiMjIFNwZWNpYWwgaW5jb21pbmcNCg0KYGBge3J9DQoNCnJvYW1TYW1wIDwtIHNjYWxlckZ1bignc3BsX2ljX21vdV82Jywnc3BsX2ljX21vdV83Jywnc3BsX2ljX21vdV84JykNCnJvYW1TYW1wJGRmMQ0Kcm9hbVNhbXAkdmFsMQ0Kcm9hbVNhbXAkdmFsMg0Kcm9hbVNhbXAkdmFsMw0Kcm9hbVNhbXAkdmFsNA0Kcm9hbVNhbXAkdmFsNQ0Kcm9hbVNhbXAkdmFsNg0Kcm9hbVNhbXAkdmFsNw0Kcm9hbVNhbXAkdmFsOA0Kcm9hbVNhbXAkdmFsOQ0Kcm9hbVNhbXAkdmFsMTANCg0KY2h1cm5GZWF0MSA8LSBjYmluZChjaHVybkZlYXQxLHJvYW1TYW1wJGRmMSRTRCkNCg0KY29sbmFtZXMoY2h1cm5GZWF0MSkgPC0gYygncm9hbV9pY19TRCcsJ3JvYW1fb2dfU0QnLCdsb2Nfb2dfdDJ0X1NEJywnbG9jX29nX3QybV9TRCcsJ2xvY19vZ190MmZfU0QnLCdsb2Nfb2dfdDJjX1NEJywnbG9jX29nX1NEJywnc3RkX29nX3QydF9TRCcsJ3N0ZF9vZ190Mm1fU0QnLCdzdGRfb2dfdDJmX1NEJywnc3RkX29nX1NEJywnaXNkX29nX1NEJywnc3BsX29nX1NEJywnb2dfb3RoZXJzX1NEJywndG90YWxfb2dfU0QnLCdsb2NfaWNfdDJ0X1NEJywnbG9jX2ljX3QybV9TRCcsJ2xvY19pY190MmZfU0QnLCdsb2NfaWNfU0QnLCdzdGRfaWNfdDJ0X1NEJywnc3RkX2ljX3QybV9TRCcsJ3N0ZF9pY190MmZfU0QnLCdzdGRfaWNfU0QnLCd0b3RhbF9pY19TRCcsJ3NwbF9pY19TRCcpDQoNCmhlYWQoY2h1cm5GZWF0MSkNCg0KDQpgYGANCk5vdGhpbmcgaW50ZXJlc3RpbmcgZ29pbmcgb24gaGVyZSB3aXRoIHRoZSBzcGVjaWFsIGNhbGxzLg0KDQojIw0KDQpgYGB7cn0NCnJvYW1TYW1wIDwtIHNjYWxlckZ1bignaXNkX2ljX21vdV82JywnaXNkX2ljX21vdV83JywnaXNkX2ljX21vdV84JykNCnJvYW1TYW1wJGRmMQ0Kcm9hbVNhbXAkdmFsMQ0Kcm9hbVNhbXAkdmFsMg0Kcm9hbVNhbXAkdmFsMw0Kcm9hbVNhbXAkdmFsNA0Kcm9hbVNhbXAkdmFsNQ0Kcm9hbVNhbXAkdmFsNg0Kcm9hbVNhbXAkdmFsNw0Kcm9hbVNhbXAkdmFsOA0Kcm9hbVNhbXAkdmFsOQ0Kcm9hbVNhbXAkdmFsMTANCg0KY2h1cm5GZWF0MSA8LSBjYmluZChjaHVybkZlYXQxLHJvYW1TYW1wJGRmMSRTRCkNCg0KY29sbmFtZXMoY2h1cm5GZWF0MSkgPC0gYygncm9hbV9pY19TRCcsJ3JvYW1fb2dfU0QnLCdsb2Nfb2dfdDJ0X1NEJywnbG9jX29nX3QybV9TRCcsJ2xvY19vZ190MmZfU0QnLCdsb2Nfb2dfdDJjX1NEJywnbG9jX29nX1NEJywnc3RkX29nX3QydF9TRCcsJ3N0ZF9vZ190Mm1fU0QnLCdzdGRfb2dfdDJmX1NEJywnc3RkX29nX1NEJywnaXNkX29nX1NEJywnc3BsX29nX1NEJywnb2dfb3RoZXJzX1NEJywndG90YWxfb2dfU0QnLCdsb2NfaWNfdDJ0X1NEJywnbG9jX2ljX3QybV9TRCcsJ2xvY19pY190MmZfU0QnLCdsb2NfaWNfU0QnLCdzdGRfaWNfdDJ0X1NEJywnc3RkX2ljX3QybV9TRCcsJ3N0ZF9pY190MmZfU0QnLCdzdGRfaWNfU0QnLCd0b3RhbF9pY19TRCcsJ3NwbF9pY19TRCcsJ2lzZF9pY19TRCcpDQoNCmhlYWQoY2h1cm5GZWF0MSkNCg0KYGBgDQoNCk5vdGhpbmcgaW50ZXJlc3RpbmcgZ29pbmcgb24gaGVyZSB0b28NCg0KIyMgT3RoZXIgaW5jb21pbmcNCg0KYGBge3J9DQpyb2FtU2FtcCA8LSBzY2FsZXJGdW4oJ2ljX290aGVyc182JywnaWNfb3RoZXJzXzcnLCdpY19vdGhlcnNfOCcpDQpyb2FtU2FtcCRkZjENCnJvYW1TYW1wJHZhbDENCnJvYW1TYW1wJHZhbDINCnJvYW1TYW1wJHZhbDMNCnJvYW1TYW1wJHZhbDQNCnJvYW1TYW1wJHZhbDUNCnJvYW1TYW1wJHZhbDYNCnJvYW1TYW1wJHZhbDcNCnJvYW1TYW1wJHZhbDgNCnJvYW1TYW1wJHZhbDkNCnJvYW1TYW1wJHZhbDEwDQoNCmNodXJuRmVhdDEgPC0gY2JpbmQoY2h1cm5GZWF0MSxyb2FtU2FtcCRkZjEkU0QpDQoNCmNvbG5hbWVzKGNodXJuRmVhdDEpIDwtIGMoJ3JvYW1faWNfU0QnLCdyb2FtX29nX1NEJywnbG9jX29nX3QydF9TRCcsJ2xvY19vZ190Mm1fU0QnLCdsb2Nfb2dfdDJmX1NEJywnbG9jX29nX3QyY19TRCcsJ2xvY19vZ19TRCcsJ3N0ZF9vZ190MnRfU0QnLCdzdGRfb2dfdDJtX1NEJywnc3RkX29nX3QyZl9TRCcsJ3N0ZF9vZ19TRCcsJ2lzZF9vZ19TRCcsJ3NwbF9vZ19TRCcsJ29nX290aGVyc19TRCcsJ3RvdGFsX29nX1NEJywnbG9jX2ljX3QydF9TRCcsJ2xvY19pY190Mm1fU0QnLCdsb2NfaWNfdDJmX1NEJywnbG9jX2ljX1NEJywnc3RkX2ljX3QydF9TRCcsJ3N0ZF9pY190Mm1fU0QnLCdzdGRfaWNfdDJmX1NEJywnc3RkX2ljX1NEJywndG90YWxfaWNfU0QnLCdzcGxfaWNfU0QnLCdpc2RfaWNfU0QnLCdpY19vdGhlcnNfU0QnKQ0KDQpoZWFkKGNodXJuRmVhdDEpDQoNCmBgYA0KDQpUaGlzIGlzIGFsc28gbm90IHZlcnkgcHJvbWlzaW5nIGZlYXR1cmUNCg0KIyMgVG90YWwgcmVjaGFyZ2UgbnVtYmVycw0KDQpgYGB7cn0NCnJvYW1TYW1wIDwtIHNjYWxlckZ1bigndG90YWxfcmVjaF9udW1fNicsJ3RvdGFsX3JlY2hfbnVtXzcnLCd0b3RhbF9yZWNoX251bV84JykNCnJvYW1TYW1wJGRmMQ0Kcm9hbVNhbXAkdmFsMQ0Kcm9hbVNhbXAkdmFsMg0Kcm9hbVNhbXAkdmFsMw0Kcm9hbVNhbXAkdmFsNA0Kcm9hbVNhbXAkdmFsNQ0Kcm9hbVNhbXAkdmFsNg0Kcm9hbVNhbXAkdmFsNw0Kcm9hbVNhbXAkdmFsOA0Kcm9hbVNhbXAkdmFsOQ0Kcm9hbVNhbXAkdmFsMTANCg0KY2h1cm5GZWF0MSA8LSBjYmluZChjaHVybkZlYXQxLHJvYW1TYW1wJGRmMSRTRCkNCg0KY29sbmFtZXMoY2h1cm5GZWF0MSkgPC0gYygncm9hbV9pY19TRCcsJ3JvYW1fb2dfU0QnLCdsb2Nfb2dfdDJ0X1NEJywnbG9jX29nX3QybV9TRCcsJ2xvY19vZ190MmZfU0QnLCdsb2Nfb2dfdDJjX1NEJywnbG9jX29nX1NEJywnc3RkX29nX3QydF9TRCcsJ3N0ZF9vZ190Mm1fU0QnLCdzdGRfb2dfdDJmX1NEJywnc3RkX29nX1NEJywnaXNkX29nX1NEJywnc3BsX29nX1NEJywnb2dfb3RoZXJzX1NEJywndG90YWxfb2dfU0QnLCdsb2NfaWNfdDJ0X1NEJywnbG9jX2ljX3QybV9TRCcsJ2xvY19pY190MmZfU0QnLCdsb2NfaWNfU0QnLCdzdGRfaWNfdDJ0X1NEJywnc3RkX2ljX3QybV9TRCcsJ3N0ZF9pY190MmZfU0QnLCdzdGRfaWNfU0QnLCd0b3RhbF9pY19TRCcsJ3NwbF9pY19TRCcsJ2lzZF9pY19TRCcsJ2ljX290aGVyc19TRCcsJ3RvdGFsX3JlY2hfbnVtX1NEJykNCg0KaGVhZChjaHVybkZlYXQxKQ0KDQpgYGANClRoZSBoaWdoZXIgU0QgdmFsdWVzIGhhdmUgbGFyZ2VyIHByb3BvcnRpb24gb2YgY2h1cm4gY2FzZXMgMjYlIGNvbXBhcmVkIHRvIHRoZSBvdGhlciBjYXNlcy4gDQoNCiMjIFRvdGFsIHJlY2hhcmdlIGFtb3VudA0KDQpgYGB7cn0NCnJvYW1TYW1wIDwtIHNjYWxlckZ1bigndG90YWxfcmVjaF9hbXRfNicsJ3RvdGFsX3JlY2hfYW10XzcnLCd0b3RhbF9yZWNoX2FtdF84JykNCnJvYW1TYW1wJGRmMQ0Kcm9hbVNhbXAkdmFsMQ0Kcm9hbVNhbXAkdmFsMg0Kcm9hbVNhbXAkdmFsMw0Kcm9hbVNhbXAkdmFsNA0Kcm9hbVNhbXAkdmFsNQ0Kcm9hbVNhbXAkdmFsNg0Kcm9hbVNhbXAkdmFsNw0Kcm9hbVNhbXAkdmFsOA0Kcm9hbVNhbXAkdmFsOQ0Kcm9hbVNhbXAkdmFsMTANCmNodXJuRmVhdDEgPC0gY2JpbmQoY2h1cm5GZWF0MSxyb2FtU2FtcCRkZjEkU0QpDQoNCmNvbG5hbWVzKGNodXJuRmVhdDEpIDwtIGMoJ3JvYW1faWNfU0QnLCdyb2FtX29nX1NEJywnbG9jX29nX3QydF9TRCcsJ2xvY19vZ190Mm1fU0QnLCdsb2Nfb2dfdDJmX1NEJywnbG9jX29nX3QyY19TRCcsJ2xvY19vZ19TRCcsJ3N0ZF9vZ190MnRfU0QnLCdzdGRfb2dfdDJtX1NEJywnc3RkX29nX3QyZl9TRCcsJ3N0ZF9vZ19TRCcsJ2lzZF9vZ19TRCcsJ3NwbF9vZ19TRCcsJ29nX290aGVyc19TRCcsJ3RvdGFsX29nX1NEJywnbG9jX2ljX3QydF9TRCcsJ2xvY19pY190Mm1fU0QnLCdsb2NfaWNfdDJmX1NEJywnbG9jX2ljX1NEJywnc3RkX2ljX3QydF9TRCcsJ3N0ZF9pY190Mm1fU0QnLCdzdGRfaWNfdDJmX1NEJywnc3RkX2ljX1NEJywndG90YWxfaWNfU0QnLCdzcGxfaWNfU0QnLCdpc2RfaWNfU0QnLCdpY19vdGhlcnNfU0QnLCd0b3RhbF9yZWNoX251bV9TRCcsJ3RvdGFsX3JlY2hfYW10X1NEJykNCg0KaGVhZChjaHVybkZlYXQxKQ0KDQpgYGANCg0KVGhlIHJlY2hhcmdlIGFtb3VudCBoYXMgc2ltaWxhciB0cmVuZCBhcyByZWNoYXJnZSBudW1iZXJzDQoNCiMjIG1heGltdW0gcmVjaGFyZ2UgYW1vdW50DQoNCmBgYHtyfQ0Kcm9hbVNhbXAgPC0gc2NhbGVyRnVuKCdtYXhfcmVjaF9hbXRfNicsJ21heF9yZWNoX2FtdF83JywnbWF4X3JlY2hfYW10XzgnKQ0Kcm9hbVNhbXAkZGYxDQpyb2FtU2FtcCR2YWwxDQpyb2FtU2FtcCR2YWwyDQpyb2FtU2FtcCR2YWwzDQpyb2FtU2FtcCR2YWw0DQpyb2FtU2FtcCR2YWw1DQpyb2FtU2FtcCR2YWw2DQpyb2FtU2FtcCR2YWw3DQpyb2FtU2FtcCR2YWw4DQpyb2FtU2FtcCR2YWw5DQpyb2FtU2FtcCR2YWwxMA0KDQpjaHVybkZlYXQxIDwtIGNiaW5kKGNodXJuRmVhdDEscm9hbVNhbXAkZGYxJFNEKQ0KDQpjb2xuYW1lcyhjaHVybkZlYXQxKSA8LSBjKCdyb2FtX2ljX1NEJywncm9hbV9vZ19TRCcsJ2xvY19vZ190MnRfU0QnLCdsb2Nfb2dfdDJtX1NEJywnbG9jX29nX3QyZl9TRCcsJ2xvY19vZ190MmNfU0QnLCdsb2Nfb2dfU0QnLCdzdGRfb2dfdDJ0X1NEJywnc3RkX29nX3QybV9TRCcsJ3N0ZF9vZ190MmZfU0QnLCdzdGRfb2dfU0QnLCdpc2Rfb2dfU0QnLCdzcGxfb2dfU0QnLCdvZ19vdGhlcnNfU0QnLCd0b3RhbF9vZ19TRCcsJ2xvY19pY190MnRfU0QnLCdsb2NfaWNfdDJtX1NEJywnbG9jX2ljX3QyZl9TRCcsJ2xvY19pY19TRCcsJ3N0ZF9pY190MnRfU0QnLCdzdGRfaWNfdDJtX1NEJywnc3RkX2ljX3QyZl9TRCcsJ3N0ZF9pY19TRCcsJ3RvdGFsX2ljX1NEJywnc3BsX2ljX1NEJywnaXNkX2ljX1NEJywnaWNfb3RoZXJzX1NEJywndG90YWxfcmVjaF9udW1fU0QnLCd0b3RhbF9yZWNoX2FtdF9TRCcsJ21heF9yZWNoX2FtdF9TRCcpDQoNCmhlYWQoY2h1cm5GZWF0MSkNCg0KYGBgDQoNCk5vdCB2ZXJ5IHByb25vdW5jZWQgdHJlbmQgaGVyZSBldmVudGhvdWdoIGhpZ2hlciBzZCB2YWx1ZXMgYmFuZCBoYXZlIGhpZ2hlciBwZXJjZW50YWdlIG9mIGNodXJuIGNhc2VzLg0KDQojIyBsYXN0IGRheSByZWNoYXJnZSBhbW91bnQNCg0KYGBge3J9DQpyb2FtU2FtcCA8LSBzY2FsZXJGdW4oJ2xhc3RfZGF5X3JjaF9hbXRfNicsJ2xhc3RfZGF5X3JjaF9hbXRfNycsJ2xhc3RfZGF5X3JjaF9hbXRfOCcpDQpyb2FtU2FtcCRkZjENCnJvYW1TYW1wJHZhbDENCnJvYW1TYW1wJHZhbDINCnJvYW1TYW1wJHZhbDMNCnJvYW1TYW1wJHZhbDQNCnJvYW1TYW1wJHZhbDUNCnJvYW1TYW1wJHZhbDYNCnJvYW1TYW1wJHZhbDcNCnJvYW1TYW1wJHZhbDgNCnJvYW1TYW1wJHZhbDkNCnJvYW1TYW1wJHZhbDEwDQoNCmNodXJuRmVhdDEgPC0gY2JpbmQoY2h1cm5GZWF0MSxyb2FtU2FtcCRkZjEkU0QpDQoNCmNvbG5hbWVzKGNodXJuRmVhdDEpIDwtIGMoJ3JvYW1faWNfU0QnLCdyb2FtX29nX1NEJywnbG9jX29nX3QydF9TRCcsJ2xvY19vZ190Mm1fU0QnLCdsb2Nfb2dfdDJmX1NEJywnbG9jX29nX3QyY19TRCcsJ2xvY19vZ19TRCcsJ3N0ZF9vZ190MnRfU0QnLCdzdGRfb2dfdDJtX1NEJywnc3RkX29nX3QyZl9TRCcsJ3N0ZF9vZ19TRCcsJ2lzZF9vZ19TRCcsJ3NwbF9vZ19TRCcsJ29nX290aGVyc19TRCcsJ3RvdGFsX29nX1NEJywnbG9jX2ljX3QydF9TRCcsJ2xvY19pY190Mm1fU0QnLCdsb2NfaWNfdDJmX1NEJywnbG9jX2ljX1NEJywnc3RkX2ljX3QydF9TRCcsJ3N0ZF9pY190Mm1fU0QnLCdzdGRfaWNfdDJmX1NEJywnc3RkX2ljX1NEJywndG90YWxfaWNfU0QnLCdzcGxfaWNfU0QnLCdpc2RfaWNfU0QnLCdpY19vdGhlcnNfU0QnLCd0b3RhbF9yZWNoX251bV9TRCcsJ3RvdGFsX3JlY2hfYW10X1NEJywnbWF4X3JlY2hfYW10X1NEJywnbGFzdF9kYXlfcmNoX2FtdF9TRCcpDQoNCmhlYWQoY2h1cm5GZWF0MSkNCg0KYGBgDQoNCk5vdCBhIHZlcnkgaW5mb3JtYXRpdmUgZmVhdHVyZQ0KDQojIyBUb3RhbCByZWNoYXJnZSBkYXRhDQoNCmBgYHtyfQ0Kcm9hbVNhbXAgPC0gc2NhbGVyRnVuKCd0b3RhbF9yZWNoX2RhdGFfNicsJ3RvdGFsX3JlY2hfZGF0YV83JywndG90YWxfcmVjaF9kYXRhXzgnKQ0Kcm9hbVNhbXAkZGYxDQpyb2FtU2FtcCR2YWwxDQpyb2FtU2FtcCR2YWwyDQpyb2FtU2FtcCR2YWwzDQpyb2FtU2FtcCR2YWw0DQpyb2FtU2FtcCR2YWw1DQpyb2FtU2FtcCR2YWw2DQpyb2FtU2FtcCR2YWw3DQpyb2FtU2FtcCR2YWw4DQpyb2FtU2FtcCR2YWw5DQpyb2FtU2FtcCR2YWwxMA0KDQpjaHVybkZlYXQxIDwtIGNiaW5kKGNodXJuRmVhdDEscm9hbVNhbXAkZGYxJFNEKQ0KDQpjb2xuYW1lcyhjaHVybkZlYXQxKSA8LSBjKCdyb2FtX2ljX1NEJywncm9hbV9vZ19TRCcsJ2xvY19vZ190MnRfU0QnLCdsb2Nfb2dfdDJtX1NEJywnbG9jX29nX3QyZl9TRCcsJ2xvY19vZ190MmNfU0QnLCdsb2Nfb2dfU0QnLCdzdGRfb2dfdDJ0X1NEJywnc3RkX29nX3QybV9TRCcsJ3N0ZF9vZ190MmZfU0QnLCdzdGRfb2dfU0QnLCdpc2Rfb2dfU0QnLCdzcGxfb2dfU0QnLCdvZ19vdGhlcnNfU0QnLCd0b3RhbF9vZ19TRCcsJ2xvY19pY190MnRfU0QnLCdsb2NfaWNfdDJtX1NEJywnbG9jX2ljX3QyZl9TRCcsJ2xvY19pY19TRCcsJ3N0ZF9pY190MnRfU0QnLCdzdGRfaWNfdDJtX1NEJywnc3RkX2ljX3QyZl9TRCcsJ3N0ZF9pY19TRCcsJ3RvdGFsX2ljX1NEJywnc3BsX2ljX1NEJywnaXNkX2ljX1NEJywnaWNfb3RoZXJzX1NEJywndG90YWxfcmVjaF9udW1fU0QnLCd0b3RhbF9yZWNoX2FtdF9TRCcsJ21heF9yZWNoX2FtdF9TRCcsJ2xhc3RfZGF5X3JjaF9hbXRfU0QnLCd0b3RhbF9yZWNoX2RhdGFfU0QnKQ0KDQpoZWFkKGNodXJuRmVhdDEpDQoNCg0KYGBgDQpOb3QgbXVjaCBpbmZvcm1hdGl2ZSBmZWF0dXJlcw0KDQojIyBNYXhpbXVtIHJlY2hhcmdlIGZvciBkYXRhDQoNCmBgYHtyfQ0Kcm9hbVNhbXAgPC0gc2NhbGVyRnVuKCdtYXhfcmVjaF9kYXRhXzYnLCdtYXhfcmVjaF9kYXRhXzcnLCdtYXhfcmVjaF9kYXRhXzgnKQ0Kcm9hbVNhbXAkZGYxDQpyb2FtU2FtcCR2YWwxDQpyb2FtU2FtcCR2YWwyDQpyb2FtU2FtcCR2YWwzDQpyb2FtU2FtcCR2YWw0DQpyb2FtU2FtcCR2YWw1DQpyb2FtU2FtcCR2YWw2DQpyb2FtU2FtcCR2YWw3DQpyb2FtU2FtcCR2YWw4DQpyb2FtU2FtcCR2YWw5DQpyb2FtU2FtcCR2YWwxMA0KDQpjaHVybkZlYXQxIDwtIGNiaW5kKGNodXJuRmVhdDEscm9hbVNhbXAkZGYxJFNEKQ0KDQpjb2xuYW1lcyhjaHVybkZlYXQxKSA8LSBjKCdyb2FtX2ljX1NEJywncm9hbV9vZ19TRCcsJ2xvY19vZ190MnRfU0QnLCdsb2Nfb2dfdDJtX1NEJywnbG9jX29nX3QyZl9TRCcsJ2xvY19vZ190MmNfU0QnLCdsb2Nfb2dfU0QnLCdzdGRfb2dfdDJ0X1NEJywnc3RkX29nX3QybV9TRCcsJ3N0ZF9vZ190MmZfU0QnLCdzdGRfb2dfU0QnLCdpc2Rfb2dfU0QnLCdzcGxfb2dfU0QnLCdvZ19vdGhlcnNfU0QnLCd0b3RhbF9vZ19TRCcsJ2xvY19pY190MnRfU0QnLCdsb2NfaWNfdDJtX1NEJywnbG9jX2ljX3QyZl9TRCcsJ2xvY19pY19TRCcsJ3N0ZF9pY190MnRfU0QnLCdzdGRfaWNfdDJtX1NEJywnc3RkX2ljX3QyZl9TRCcsJ3N0ZF9pY19TRCcsJ3RvdGFsX2ljX1NEJywnc3BsX2ljX1NEJywnaXNkX2ljX1NEJywnaWNfb3RoZXJzX1NEJywndG90YWxfcmVjaF9udW1fU0QnLCd0b3RhbF9yZWNoX2FtdF9TRCcsJ21heF9yZWNoX2FtdF9TRCcsJ2xhc3RfZGF5X3JjaF9hbXRfU0QnLCd0b3RhbF9yZWNoX2RhdGFfU0QnLCdtYXhfcmVjaF9kYXRhX1NEJykNCg0KaGVhZChjaHVybkZlYXQxKQ0KDQoNCmBgYA0KDQpUaGlzIHN0cmF0ZWd5IG9mIHN0YW5kYXJkIGRldmlhdGlvbiBub3QgdmVyeSBpbmZvcm1hdGl2ZSBmb3IgdGhlc2UgZmVhdHVyZXMNCg0KIyMgQ291bnQgb2YgMmcgLzNnIHJlY2hhcmdlDQoNCmBgYHtyfQ0Kcm9hbVNhbXAgPC0gc2NhbGVyRnVuKCdqdW5fdmJjXzNnJywnanVsX3ZiY18zZycsJ2F1Z192YmNfM2cnKQ0Kcm9hbVNhbXAkZGYxDQpyb2FtU2FtcCR2YWwxDQpyb2FtU2FtcCR2YWwyDQpyb2FtU2FtcCR2YWwzDQpyb2FtU2FtcCR2YWw0DQpyb2FtU2FtcCR2YWw1DQpyb2FtU2FtcCR2YWw2DQpyb2FtU2FtcCR2YWw3DQpyb2FtU2FtcCR2YWw4DQpyb2FtU2FtcCR2YWw5DQpyb2FtU2FtcCR2YWwxMA0KDQpjaHVybkZlYXQxIDwtIGNiaW5kKGNodXJuRmVhdDEscm9hbVNhbXAkZGYxJFNEKQ0KDQpjb2xuYW1lcyhjaHVybkZlYXQxKSA8LSBjKCdyb2FtX2ljX1NEJywncm9hbV9vZ19TRCcsJ2xvY19vZ190MnRfU0QnLCdsb2Nfb2dfdDJtX1NEJywnbG9jX29nX3QyZl9TRCcsJ2xvY19vZ190MmNfU0QnLCdsb2Nfb2dfU0QnLCdzdGRfb2dfdDJ0X1NEJywnc3RkX29nX3QybV9TRCcsJ3N0ZF9vZ190MmZfU0QnLCdzdGRfb2dfU0QnLCdpc2Rfb2dfU0QnLCdzcGxfb2dfU0QnLCdvZ19vdGhlcnNfU0QnLCd0b3RhbF9vZ19TRCcsJ2xvY19pY190MnRfU0QnLCdsb2NfaWNfdDJtX1NEJywnbG9jX2ljX3QyZl9TRCcsJ2xvY19pY19TRCcsJ3N0ZF9pY190MnRfU0QnLCdzdGRfaWNfdDJtX1NEJywnc3RkX2ljX3QyZl9TRCcsJ3N0ZF9pY19TRCcsJ3RvdGFsX2ljX1NEJywnc3BsX2ljX1NEJywnaXNkX2ljX1NEJywnaWNfb3RoZXJzX1NEJywndG90YWxfcmVjaF9udW1fU0QnLCd0b3RhbF9yZWNoX2FtdF9TRCcsJ21heF9yZWNoX2FtdF9TRCcsJ2xhc3RfZGF5X3JjaF9hbXRfU0QnLCd0b3RhbF9yZWNoX2RhdGFfU0QnLCdtYXhfcmVjaF9kYXRhX1NEJywnYXVnX3ZiY19TRCcpDQoNCmhlYWQoY2h1cm5GZWF0MSkNCg0KYGBgDQoNCg0KY291bnRfcmVjaF8yZ182IDogTm90IGluZm9ybWF0aXZlIA0KY291bnRfcmVjaF8zZ182IDogTm90IGluZm9ybWF0aXZlIA0KYXZfcmVjaF9hbXRfZGF0YV82DQp2b2xfMmdfbWJfNiAvIDNnDQphcnB1XzNnXzggLyAyZw0KbmlnaHRfcGNrX3VzZXJfOA0KDQoNCg0KDQoNCg0KDQoNCg0KDQpgYGB7cn0NCmNodXJuRGF0YVsxOjEwLF0NCmBgYA0KDQoNCg0KDQojIyBVc2luZyB0aGUgbmV3IGZlYXR1cmVzIHRvIGJ1aWxkIGEgbW9kZWwNCg0KYGBge3J9DQoNCg0KIyBBZGRpbmcgdGhlIHRhcmdldCB2YXJpYWJsZSB3aXRoIHRoZSBuZXcgZmVhdHVyZXMNCg0KY2h1cm5GZWF0MSRjaHVybiA8LSBjaHVyblNhbXAyX3RyYW4kdGFyZ2V0DQpoZWFkKGNodXJuRmVhdDEpDQoNCmBgYA0KIyBMZXQgdXMgc3BvdCBjaGVjayB3aXRoIGRpZmZlcmVudCBtb2RlbHMNCg0KYGBge3J9DQpsaWJyYXJ5KGNhcmV0KQ0KDQpjaHVybkZlYXQxJGNodXJuIDwtIGZhY3RvcihjaHVybkZlYXQxJGNodXJuKQ0KDQojIDEwIGZvbGQgY3Jvc3MgdmFsaWRhdGlvbg0KDQp0cmFpbkMgPC0gdHJhaW5Db250cm9sKG1ldGhvZD0ncmVwZWF0ZWRjdicsbnVtYmVyID0gMTAscmVwZWF0cyA9IDMsY2xhc3NQcm9icyA9IFRSVUUpDQoNCm1ldHJpYyAgPC0gJ1JPQycNCg0KIyBMb2dpc3RpYyBSZWdyZXNzaW9uDQoNCnNldC5zZWVkKDEyMykNCg0KZml0LmdsbSA8LSB0cmFpbihjaHVybn4uLGRhdGEgPSBjaHVybkZlYXQxLG1ldGhvZD0nZ2xtJyxtZXRyaWM9J0FjY3VyYWN5Jyx0ckNvbnRyb2w9dHJhaW5DKQ0KDQojIEdMTU5FVA0KDQpzZXQuc2VlZCgxMjMpDQoNCmZpdC5nbG1uZXQgPC0gdHJhaW4oY2h1cm5+LixkYXRhID0gY2h1cm5GZWF0MSxtZXRob2Q9J2dsbW5ldCcsbWV0cmljPW1ldHJpYyx0ckNvbnRyb2w9dHJhaW5DKQ0KDQojIEtOTg0KDQpzZXQuc2VlZCgxMjMpDQoNCmZpdC5rbm4gPC0gdHJhaW4oY2h1cm5+LixkYXRhID0gY2h1cm5GZWF0MSxtZXRob2Q9J2tubicsbWV0cmljPW1ldHJpYyx0ckNvbnRyb2w9dHJhaW5DKQ0KDQojIENBUlQNCg0Kc2V0LnNlZWQoMTIzKQ0KDQpmaXQuY2FydCA8LSB0cmFpbihjaHVybn4uLGRhdGEgPSBjaHVybkZlYXQxLG1ldGhvZD0ncnBhcnQnLG1ldHJpYz1tZXRyaWMsdHJDb250cm9sPXRyYWluQykNCg0KIyBOQg0KDQpzZXQuc2VlZCgxMjMpDQoNCmZpdC5uYiA8LSB0cmFpbihjaHVybn4uLGRhdGEgPSBjaHVybkZlYXQxLG1ldGhvZD0nbmInLG1ldHJpYz1tZXRyaWMsdHJDb250cm9sPXRyYWluQykNCg0KIyBTVk0NCg0Kc2V0LnNlZWQoMTIzKQ0KDQpmaXQuc3ZtIDwtIHRyYWluKGNodXJufi4sZGF0YSA9IGNodXJuRmVhdDEsbWV0aG9kPSdzdm1SYWRpYWwnLG1ldHJpYz1tZXRyaWMsdHJDb250cm9sPXRyYWluQykNCg0KIyBCYWdnZWQgQ0FSVA0KDQpzZXQuc2VlZCgxMjMpDQoNCmZpdC50cmVlYmFnIDwtIHRyYWluKGNodXJufi4sZGF0YSA9IGNodXJuRmVhdDEsbWV0aG9kPSd0cmVlYmFnJyxtZXRyaWM9bWV0cmljLHRyQ29udHJvbD10cmFpbkMpDQoNCiMgUkYNCg0Kc2V0LnNlZWQoMTIzKQ0KDQpmaXQuUkYgPC0gdHJhaW4oY2h1cm5+LixkYXRhID0gY2h1cm5GZWF0MSxtZXRob2Q9J3JmJyxtZXRyaWM9bWV0cmljLHRyQ29udHJvbD10cmFpbkMpDQoNCiMgU3RvY2hhc3RpYyBHcmFkaWVudCBib29zdGluZw0KDQpzZXQuc2VlZCgxMjMpDQoNCmZpdC5nYm0gPC0gdHJhaW4oY2h1cm5+LixkYXRhID0gY2h1cm5GZWF0MSxtZXRob2Q9J2dibScsbWV0cmljPW1ldHJpYyx0ckNvbnRyb2w9dHJhaW5DLHZlcmJvc2U9RkFMU0UpDQoNCg0KIyBDb21wYXJpbmcgYWxnb3JpdGhtcw0KDQpyZXN1bHRzIDwtIHJlc2FtcGxlcyhsaXN0KExHPWZpdC5nbG0sR2xtbmV0PWZpdC5nbG1uZXQsS05OID0gZml0LmtubixDQVJUPWZpdC5jYXJ0LE5CPWZpdC5uYixTVk09Zml0LnN2bSxCQ0FSVD1maXQudHJlZWJhZyxSRiA9IGZpdC5SRixHQk09Zml0LmdibSkpDQoNCnN1bW1hcnkocmVzdWx0cykNCg0KZG90UGxvdChyZXN1bHRzKQ0KDQoNCmBgYA0KDQpgYGB7cn0NCnVuaXF1ZShjaHVybkZlYXQxJGNodXJuDQpgYGANCg0K